{"version":3,"file":"o3r-rules-engine.mjs","sources":["../../src/components/rules-engine/shared/fallback-to.pipe.ts","../../src/components/rules-engine/shared/json-or-string.pipe.ts","../../src/components/rules-engine/shared/ruleset-history.helper.ts","../../src/components/rules-engine/facts-snapshot/facts-snapshot.component.ts","../../src/components/rules-engine/facts-snapshot/facts-snapshot.template.html","../../src/components/rules-engine/rule-key-value/rule-key-value-pres.component.ts","../../src/components/rules-engine/rule-key-value/rule-key-value-pres.template.html","../../src/components/rules-engine/rule-actions/rule-actions-pres.component.ts","../../src/components/rules-engine/rule-actions/rule-actions-pres.template.html","../../src/components/rules-engine/rule-condition/rule-condition-pres.component.ts","../../src/components/rules-engine/rule-condition/rule-condition-pres.template.html","../../src/components/rules-engine/rule-tree/rule-tree-pres.component.ts","../../src/components/rules-engine/rule-tree/rule-tree-pres.template.html","../../src/components/rules-engine/ruleset-history/ruleset-history-pres.component.ts","../../src/components/rules-engine/ruleset-history/ruleset-history-pres.template.html","../../src/components/rules-engine/ruleset-history/ruleset-history-pres.module.ts","../../src/devkit/rules-engine-devkit.interface.ts","../../src/services/rules-engine.token.ts","../../src/stores/rulesets/rulesets.actions.ts","../../src/stores/rulesets/rulesets.effect.ts","../../src/stores/rulesets/rulesets.reducer.ts","../../src/stores/rulesets/rulesets.state.ts","../../src/stores/rulesets/rulesets.module.ts","../../src/stores/rulesets/rulesets.selectors.ts","../../src/stores/rulesets/rulesets.sync.ts","../../src/engine/debug/helpers.ts","../../src/engine/debug/engine.debug.ts","../../src/engine/helpers/filter-ruleset-event.operator.ts","../../src/engine/operator/operator.helpers.ts","../../src/engine/operator/operators/array-based.operators.ts","../../src/engine/operator/operators/basic.operators.ts","../../src/engine/operator/operators/date-based.operators.ts","../../src/engine/operator/operators/number-based.operators.ts","../../src/engine/operator/operators/index.ts","../../src/engine/rule/rule.helpers.ts","../../src/engine/ruleset-executor.ts","../../src/engine/engine.ts","../../src/services/runner/rules-engine.runner.service.ts","../../src/services/runner/rules-engine.runner.module.ts","../../src/devkit/rules-engine-devtools.token.ts","../../src/devkit/rules-engine-devtools.service.ts","../../src/devkit/rules-engine-devtools.console.service.ts","../../src/devkit/rules-engine-devtools.message.service.ts","../../src/devkit/rules-engine-devtools.module.ts","../../src/fact/fact.abstract-service.ts","../../src/inner-facts/current-time/current-time-fact.service.ts","../../src/o3r-rules-engine.ts"],"sourcesContent":["import {\n  Pipe,\n  PipeTransform,\n} from '@angular/core';\n\n@Pipe({ name: 'o3rFallbackTo' })\nexport class O3rFallbackToPipe implements PipeTransform {\n  public transform<T>(value: T, fallback = 'undefined'): T | string {\n    return value === undefined ? fallback : value;\n  }\n}\n","import {\n  Pipe,\n  PipeTransform,\n} from '@angular/core';\n\n@Pipe({ name: 'o3rJsonOrString' })\nexport class O3rJsonOrStringPipe implements PipeTransform {\n  /**\n   * @inheritDoc\n   */\n  public transform(value: any): string {\n    if (typeof value === 'string') {\n      return value;\n    }\n    return JSON.stringify(value, null, 2);\n  }\n}\n","import type {\n  DebugEvent,\n  Ruleset,\n  RulesetExecutionErrorEvent,\n  RulesetExecutionEvent,\n} from '../../../engine';\nimport type {\n  RulesetExecutionDebug,\n  RulesetExecutionStatus,\n} from '../ruleset-history/ruleset-history-pres.component';\n\n/**\n * Compute the status of the execution depending on its execution event type, the output and whether the execution\n * is still active\n * @param rulesetExecution\n * @param isActive\n */\nexport const getStatus = (rulesetExecution: RulesetExecutionErrorEvent | RulesetExecutionEvent, isActive: boolean): RulesetExecutionStatus => {\n  if (rulesetExecution.type === 'RulesetExecutionError') {\n    return 'Error';\n  } else if (rulesetExecution.outputActions?.length === 0) {\n    return 'NoEffect';\n  } else if (isActive) {\n    return 'Active';\n  }\n  return 'Deactivated';\n};\n\n/**\n * Transform the output of the debug reports into the model for the ruleset history debug panel\n * @param events\n * @param rulesetMap\n */\nexport const rulesetReportToHistory = (events: DebugEvent[], rulesetMap: Record<string, Ruleset>): RulesetExecutionDebug[] => {\n  const availableRulesets = (events.filter((e) => e.type === 'AvailableRulesets').reverse()[0])?.availableRulesets || [];\n  const lastActiveRulesets = (events.filter((e) => e.type === 'ActiveRulesets').reverse()[0])?.rulesets || [];\n\n  return availableRulesets\n    .filter((ruleset) => !!ruleset)\n    .reduce<(RulesetExecutionEvent | RulesetExecutionErrorEvent)[]>((acc, ruleset) => {\n    const rulesetExecutions = events\n      .filter((e): e is RulesetExecutionEvent | RulesetExecutionErrorEvent => ((e.type === 'RulesetExecutionError' || e.type === 'RulesetExecution') && e.rulesetId === ruleset.id));\n    if (rulesetExecutions) {\n      acc.push(...rulesetExecutions);\n    }\n    return acc;\n  }, [])\n    .sort((execA, execB) => execB.timestamp - execA.timestamp)\n    .map((rulesetExecution) => {\n      const rulesetInformation = rulesetMap[rulesetExecution.rulesetId];\n      const isActive = lastActiveRulesets.find((r) => r.id === rulesetExecution.rulesetId);\n      return {\n        ...rulesetExecution,\n        status: getStatus(rulesetExecution, !!isActive),\n        isActive: !!isActive,\n        rulesetInformation,\n        rulesEvaluations: (rulesetExecution.rulesEvaluations || []).sort((evalA, evalB) =>\n          (rulesetInformation?.rules.findIndex((r) => r.id === evalA.rule.id) || -1)\n          - (rulesetInformation?.rules.findIndex((r) => r.id === evalB.rule.id) || -1)\n        )\n      };\n    });\n};\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  input,\n  signal,\n  ViewEncapsulation,\n} from '@angular/core';\nimport {\n  FormsModule,\n  ReactiveFormsModule,\n} from '@angular/forms';\nimport type {\n  Facts,\n} from '../../../engine';\nimport {\n  O3rJsonOrStringPipe,\n} from '../shared/index';\n\n@Component({\n  selector: 'o3r-facts-snapshot',\n  styleUrls: ['./facts-snapshot.style.scss'],\n  templateUrl: './facts-snapshot.template.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  standalone: true,\n  imports: [\n    O3rJsonOrStringPipe,\n    FormsModule,\n    ReactiveFormsModule\n  ],\n  encapsulation: ViewEncapsulation.None\n})\nexport class FactsSnapshotComponent {\n  /**\n   * Full list of available facts with their current value\n   */\n  public readonly facts = input.required<{ factName: string; value: Facts }[]>();\n\n  /**\n   * Search terms\n   */\n  public readonly search = signal('');\n\n  /**\n   * Filtered list of facts using search terms\n   */\n  public readonly filteredFacts = computed(() => {\n    const search = this.search();\n    const facts = this.facts();\n    if (search) {\n      const matchString = new RegExp(search.replace(/[\\s#$()*+,.?[\\\\\\]^{|}-]/g, '\\\\$&'), 'i');\n      return facts.filter(({ factName, value }) =>\n        matchString.test(factName)\n        || (typeof value === 'object'\n          ? matchString.test(JSON.stringify(value))\n          : matchString.test(String(value)))\n      );\n    } else {\n      return facts;\n    }\n  });\n}\n","<section>\n  @if (facts().length < 1) {\n    <div class=\"m-2\">\n      No facts are registered.\n    </div>\n  } @else {\n    <div class=\"input-group\">\n      <label class=\"input-group-text\" for=\"search-fact\">\n        <span class=\"mx-1 fa-search\" aria-label=\"Search\"></span>\n      </label>\n      <input class=\"form-control\" [(ngModel)]=\"search\" type=\"text\" id=\"search-fact\" placeholder=\"Search for fact name or value\" />\n    </div>\n    <div class=\"mt-3\">\n      List of <b>{{facts().length}}</b> registered facts\n      @if (facts().length > filteredFacts().length) { (<b>{{filteredFacts().length}}</b> matching the search) }\n    </div>\n    <ul>\n    @for (fact of filteredFacts(); track fact.factName) {\n      <li>\n        <span class=\"fact-name\">{{fact.factName}}: </span>\n        <span class=\"fact-value\">{{fact.value | o3rJsonOrString}}</span>\n      </li>\n    }\n    </ul>\n  }\n</section>\n","import {\n  CommonModule,\n  JsonPipe,\n} from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  Input,\n  OnChanges,\n  SimpleChanges,\n  ViewEncapsulation,\n} from '@angular/core';\nimport {\n  of,\n  Subject,\n} from 'rxjs';\nimport {\n  delay,\n  startWith,\n  switchMap,\n} from 'rxjs/operators';\n\n/**\n * Duration of the notification for clipboard feature (in milliseconds)\n */\nconst NOTIFICATION_DURATION = 1750;\n\n/**\n * Minimal length required to enable clipboard feature\n */\nconst CLIPBOARD_FEATURE_LENGTH_THRESHOLD = 80;\n\n@Component({\n  selector: 'o3r-rule-key-value-pres',\n  styleUrls: ['./rule-key-value-pres.style.scss'],\n  templateUrl: './rule-key-value-pres.template.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  imports: [CommonModule, JsonPipe]\n})\nexport class RuleKeyValuePresComponent implements OnChanges {\n  /**\n   * Key of the object (name of the fact for example)\n   */\n  @Input()\n  public key?: string;\n\n  /**\n   * Current value of the object\n   */\n  @Input()\n  public value!: string;\n\n  /**\n   * Previous value of the object\n   */\n  @Input()\n  public oldValue?: string;\n\n  /**\n   * Type of display:\n   * - 'state':      `key: value`, `key: oldValue -> value` or `oldValue -> value`\n   * - 'assignment': `key = value`\n   */\n  @Input()\n  public type: 'state' | 'assignment' = 'state';\n\n  public shouldLimitCharactersForValue = true;\n  public isClipBoardFeatureAvailableForValue = false;\n  public isValuePrimitiveType = false;\n\n  public shouldLimitCharactersForOldValue = true;\n  public isClipBoardFeatureAvailableForOldValue = false;\n  public isOldValuePrimitiveType = false;\n\n  private readonly triggerNotification = new Subject<void>();\n  public showNotification$ = this.triggerNotification.asObservable().pipe(\n    switchMap(() => of(false).pipe(delay(NOTIFICATION_DURATION), startWith(true)))\n  );\n\n  private isClipBoardFeatureAvailable(value: string | undefined) {\n    return !!(navigator.clipboard && value && value.length > CLIPBOARD_FEATURE_LENGTH_THRESHOLD);\n  }\n\n  public ngOnChanges({ value, oldValue }: SimpleChanges) {\n    if (value) {\n      this.isValuePrimitiveType = value.currentValue === null || typeof value.currentValue !== 'object';\n      this.isClipBoardFeatureAvailableForValue = this.isClipBoardFeatureAvailable(this.isValuePrimitiveType ? String(value.currentValue) : JSON.stringify(value.currentValue));\n    }\n    if (oldValue) {\n      this.isOldValuePrimitiveType = oldValue.currentValue === null || typeof oldValue.currentValue !== 'object';\n      this.isClipBoardFeatureAvailableForOldValue = this.isClipBoardFeatureAvailable(this.isOldValuePrimitiveType ? String(oldValue.currentValue) : JSON.stringify(oldValue.currentValue));\n    }\n  }\n\n  public async copyToClipBoard(content: string) {\n    await navigator.clipboard.writeText(content);\n    this.triggerNotification.next();\n  }\n}\n","<span *ngIf=\"key\" class=\"input-key\">{{key}}<ng-container *ngIf=\"type === 'state'\">: </ng-container></span>\n<ng-container *ngIf=\"type === 'assignment'\"> = </ng-container>\n<ng-container *ngIf=\"oldValue\">\n  <pre class=\"input-value\"\n    [class.limit-characters]=\"shouldLimitCharactersForOldValue\"\n    (click)=\"shouldLimitCharactersForOldValue = !shouldLimitCharactersForOldValue\"\n    (keyup.enter)=\"shouldLimitCharactersForOldValue = !shouldLimitCharactersForOldValue\"\n    tabindex=\"0\"\n  >\n    {{isOldValuePrimitiveType ? oldValue : (oldValue | json)}}\n  </pre>\n  <button (click)=\"copyToClipBoard(oldValue)\" *ngIf=\"isClipBoardFeatureAvailableForOldValue\" title=\"Copy to clipboard\">📋</button>\n  →\n</ng-container>\n<pre class=\"input-value\"\n  [class.limit-characters]=\"shouldLimitCharactersForValue\"\n  (click)=\"shouldLimitCharactersForValue = !shouldLimitCharactersForValue\"\n  (keyup.enter)=\"shouldLimitCharactersForValue = !shouldLimitCharactersForValue\"\n  tabindex=\"0\"\n>\n  {{isValuePrimitiveType ? value : (value | json)}}\n</pre>\n<button (click)=\"copyToClipBoard(value)\" *ngIf=\"isClipBoardFeatureAvailableForValue\" title=\"Copy to clipboard\">📋</button>\n<div role=\"alert\" class=\"notification\" *ngIf=\"showNotification$ | async\">Copied to clipboard</div>\n","import {\n  CommonModule,\n  JsonPipe,\n} from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  Input,\n  ViewEncapsulation,\n} from '@angular/core';\nimport type {\n  ActionBlock,\n  AllBlock,\n  Facts,\n} from '../../../engine';\nimport {\n  RuleKeyValuePresComponent,\n} from '../rule-key-value/rule-key-value-pres.component';\nimport {\n  O3rFallbackToPipe,\n} from '../shared/index';\n\n@Component({\n  selector: 'o3r-rule-actions-pres',\n  styleUrls: ['./rule-actions-pres.style.scss'],\n  templateUrl: './rule-actions-pres.template.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  imports: [CommonModule, JsonPipe, RuleKeyValuePresComponent, O3rFallbackToPipe]\n})\nexport class RuleActionsPresComponent {\n  /**\n   * List of all the output actions of a rules or ruleset execution\n   */\n  @Input()\n  public actions: AllBlock[] = [];\n\n  /**\n   * The list of temporary facts used and/or modified within the rule or the ruleset.\n   * They are scoped to the ruleset and their value is the one after the rule or ruleset execution.\n   */\n  @Input()\n  public temporaryFacts: Record<string, Facts> = {};\n\n  /**\n   * List of temporary facts that will be modified by the ruleset or the rule.\n   */\n  @Input()\n  public runtimeOutputs: string[] = [];\n\n  /**\n   * Check if a given block is of type ActionBlock\n   * @param block\n   */\n  public isActionBlock(block: AllBlock): block is ActionBlock {\n    return !!(block as ActionBlock).actionType;\n  }\n}\n","<div class=\"ruleset-panel-category-title\">Output Actions</div>\n@if (actions?.length === 0 && runtimeOutputs.length === 0) {\n  <div class=\"ruleset-panel-category-body empty\">\n    No action\n  </div>\n} @else {\n  <ul class=\"ruleset-panel-category-body\">\n    @for (action of actions; track $index) {\n      <li>\n        @if (isActionBlock(action)) {\n          @switch (action.actionType) {\n            @case ('SET_FACT') {\n              <div>\n                <div>Set Fact</div>\n                <div>\n                  <o3r-rule-key-value-pres\n                    [key]=\"action.fact | o3rFallbackTo: 'Missing \\'fact\\''\"\n                    [value]=\"action.value | o3rFallbackTo\"\n                    [type]=\"'assignment'\"></o3r-rule-key-value-pres>\n                </div>\n              </div>\n            }\n            @case ('UPDATE_CONFIG') {\n              <div>\n                <div>Update Config {{action.component}} {{action.library}}</div>\n                <div>\n                  <o3r-rule-key-value-pres\n                    [key]=\"action.property | o3rFallbackTo: 'Missing \\'property\\''\"\n                    [value]=\"action.value | o3rFallbackTo\"\n                    [type]=\"'assignment'\"></o3r-rule-key-value-pres>\n                </div>\n              </div>\n            }\n            @case ('UPDATE_ASSET') {\n              <div>\n                <div>Update Asset:</div>\n                <div>\n                  <o3r-rule-key-value-pres\n                    [oldValue]=\"action.asset | o3rFallbackTo: 'Missing \\'asset\\''\"\n                    [value]=\"action.value | o3rFallbackTo\"\n                    [type]=\"'state'\"></o3r-rule-key-value-pres>\n                </div>\n              </div>\n            }\n            @case ('UPDATE_LOCALISATION') {\n              <div>\n                <div>Update localization:</div>\n                <div>\n                  <o3r-rule-key-value-pres\n                    [oldValue]=\"action.key | o3rFallbackTo: 'Missing \\'key\\''\"\n                    [value]=\"action.value | o3rFallbackTo\"\n                    [type]=\"'state'\"></o3r-rule-key-value-pres>\n                </div>\n              </div>\n            }\n            @case ('UPDATE_PLACEHOLDER') {\n              <div [class.error]=\"!action.placeholderId\">\n                <div>Update placeholder in {{action.component}} {{action.library}}</div>\n                <div>\n                  <o3r-rule-key-value-pres\n                    [oldValue]=\"action.placeholderId | o3rFallbackTo: 'Missing \\'placeholderId\\''\"\n                    [value]=\"action.value\"\n                    [type]=\"'state'\"></o3r-rule-key-value-pres>\n                </div>\n              </div>\n            }\n            @default {\n              <div class=\"error\">\n                <div>Unrecognized action</div>\n                <div>{{action | json}}</div>\n              </div>\n            }\n          }\n        }\n      </li>\n    }\n    @for (runtimeOutput of runtimeOutputs; track $index) {\n      <li>\n        <div>Set temporary fact</div>\n        <div>\n          <o3r-rule-key-value-pres\n            [key]=\"runtimeOutput | o3rFallbackTo: 'Missing \\'fact\\''\"\n            [value]=\"temporaryFacts[runtimeOutput] | o3rFallbackTo\"\n            [type]=\"'assignment'\"></o3r-rule-key-value-pres>\n        </div>\n      </li>\n    }\n  </ul>\n}\n","import {\n  CommonModule,\n} from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  Input,\n  ViewEncapsulation,\n} from '@angular/core';\nimport type {\n  BinaryOperation,\n  GenericOperand,\n  OperandFact,\n  TopLevelCondition,\n  UnaryOperation,\n} from '../../../engine';\n\n@Component({\n  selector: 'o3r-rule-condition-pres',\n  styleUrls: ['./rule-condition-pres.style.scss'],\n  templateUrl: './rule-condition-pres.template.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  imports: [CommonModule]\n})\nexport class RuleConditionPresComponent {\n  private _condition?: TopLevelCondition;\n\n  /**\n   * Left hand operator as it will be displayed in the template.\n   * In the case of a fact with a json path, will resolve the whole fact path, else will only display the value\n   */\n  public lhs = 'undefined';\n\n  /**\n   * Right hand operator as it will be displayed in the template.\n   * In the case of a fact with a json path, will resolve the whole fact path, else will only display the value\n   */\n  public rhs: string | undefined;\n\n  /**\n   * Rule condition that will be flattened by the component setter\n   */\n  @Input()\n  public set condition(condition: TopLevelCondition | undefined) {\n    this._condition = condition;\n    this.lhs = (condition as UnaryOperation | BinaryOperation)?.lhs ? this.getOperandName((condition as UnaryOperation | BinaryOperation).lhs) : 'undefined';\n    this.rhs = (condition as BinaryOperation)?.rhs ? this.getOperandName((condition as BinaryOperation).rhs) : undefined;\n  }\n\n  public get condition(): TopLevelCondition | undefined {\n    return this._condition;\n  }\n\n  private getOperandName(operand: GenericOperand): string {\n    const value = `${operand.value ?? 'MISSING_VALUE'}`;\n    return (operand as OperandFact).path ? (operand as OperandFact).path!.replace(/^\\$/, value) : value;\n  }\n}\n","<ng-container *ngIf=\"!condition; else displayConditions\">\n  <span class=\"input-value\">true</span>\n</ng-container>\n<ng-template #displayConditions>\n  <ng-container *ngIf=\"!$any(condition).all && !$any(condition).any && !$any(condition).not\">\n    <span class=\"input-key\">{{ lhs }}</span> {{ $any(condition).operator }} <span class=\"input-value\" *ngIf=\"rhs !== undefined\">{{ rhs }}</span>\n  </ng-container>\n  <ng-container *ngIf=\"$any(condition).all || $any(condition).any || $any(condition).not\">\n    <span *ngIf=\"$any(condition).all\">ALL</span>\n    <span *ngIf=\"$any(condition).any\">ANY</span>\n    <span *ngIf=\"$any(condition).not\">NOT</span>\n    <span>(\n    <ng-container *ngFor=\"let cond of $any(condition).all || $any(condition).any || [$any(condition).not]; let last = last;\">\n      <o3r-rule-condition-pres [condition]=\"cond\"></o3r-rule-condition-pres>\n      <span *ngIf=\"!last\">, </span>\n    </ng-container>\n  )</span>\n  </ng-container>\n</ng-template>\n","import {\n  CommonModule,\n} from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  Input,\n  ViewEncapsulation,\n} from '@angular/core';\nimport type {\n  AllBlock,\n  TopLevelCondition,\n} from '../../../engine';\nimport {\n  RuleActionsPresComponent,\n} from '../rule-actions/rule-actions-pres.component';\nimport {\n  RuleConditionPresComponent,\n} from '../rule-condition/rule-condition-pres.component';\n\n@Component({\n  selector: 'o3r-rule-tree-pres',\n  styleUrls: ['./rule-tree-pres.style.scss'],\n  templateUrl: './rule-tree-pres.template.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  imports: [CommonModule, RuleActionsPresComponent, RuleConditionPresComponent]\n})\nexport class RuleTreePresComponent {\n  /**\n   * Rule name. Will only be defined at the root of the rule tree.\n   */\n  @Input()\n  public name?: string;\n\n  /**\n   * Type of the block being resolved.\n   * A type \"IF_ELSE\" will display two branches and the success and failure outputs associated\n   * Else, only the successElements will be shown\n   */\n  @Input()\n  public blockType = '';\n\n  /**\n   * The condition under which the success elements will be displayed.\n   */\n  @Input()\n  public condition?: TopLevelCondition;\n\n  /**\n   * If case output\n   */\n  @Input()\n  public successElements: AllBlock[] = [];\n\n  /**\n   * Else case output\n   */\n  @Input()\n  public failureElements: AllBlock[] = [];\n\n  /**\n   * Should the \"Else case scenario\" actions be displayed\n   */\n  public failureActionsExpanded = false;\n\n  /**\n   * Should the \"If case scenario\" actions be displayed\n   */\n  public successActionsExpanded = false;\n}\n","<span *ngIf=\"name\">{{name | titlecase}}:</span>\n<div class=\"rule-wrapper tree\">\n  <ng-container *ngIf=\"blockType === 'IF_ELSE'; else noCondition\">\n    <div class=\"tree-root\" *ngIf=\"!name\" [attr.aria-hidden]=\"true\">\n      <div></div>\n      <div></div>\n    </div>\n    <div class=\"rule-conditions\">\n      <div class=\"rule-conditions-title\">If\n        <o3r-rule-condition-pres [condition]=\"condition\"></o3r-rule-condition-pres>\n      </div>\n      <div class=\"tree-root\" [attr.aria-hidden]=\"true\">\n        <div></div>\n        <div></div>\n      </div>\n    </div>\n    <div class=\"rule-actions-wrapper tree-node\">\n      <div class=\"rule-actions tree-branch\">\n        <div class=\"tree-leaf\" [attr.aria-hidden]=\"true\">\n          <div></div>\n          <div></div>\n        </div>\n        <div class=\"rule-action-title success-actions\"\n            tabindex=\"0\"\n            (click)=\"successActionsExpanded = !successActionsExpanded\"\n            (keyup.enter)=\"successActionsExpanded = !successActionsExpanded\">\n          <i class=\"icon refx-icon-validate\"></i>\n          <span>Then</span>\n          <i class=\"icon\"\n            [class.icon-caret-down]=\"!successActionsExpanded\"\n            [class.icon-caret-up]=\"successActionsExpanded\">\n          </i>\n        </div>\n        <o3r-rule-actions-pres class=\"rule-tree-actions\" *ngIf=\"successActionsExpanded\"\n                              [actions]=\"successElements\">\n        </o3r-rule-actions-pres>\n        <ng-container [ngTemplateOutlet]=\"subTree\" [ngTemplateOutletContext]=\"{blocks: successElements}\"></ng-container>\n      </div>\n      <div class=\"rule-actions tree-branch\">\n        <div class=\"tree-leaf\" [attr.aria-hidden]=\"true\">\n          <div></div>\n          <div></div>\n        </div>\n        <div class=\"rule-action-title error-actions\"\n            tabindex=\"0\"\n            (click)=\"failureActionsExpanded = !failureActionsExpanded\"\n            (keyup.enter)=\"failureActionsExpanded = !failureActionsExpanded\">\n          <i class=\"icon refx-icon-cross\"></i>\n          <span>Else</span>\n          <i class=\"icon\"\n            [class.icon-caret-down]=\"!failureActionsExpanded\"\n            [class.icon-caret-up]=\"failureActionsExpanded\">\n          </i>\n        </div>\n        <o3r-rule-actions-pres class=\"rule-tree-actions\"\n                              *ngIf=\"failureActionsExpanded\"\n                              [actions]=\"failureElements\">\n        </o3r-rule-actions-pres>\n        <ng-container [ngTemplateOutlet]=\"subTree\" [ngTemplateOutletContext]=\"{blocks: failureElements}\"></ng-container>\n      </div>\n    </div>\n  </ng-container>\n</div>\n<ng-template #noCondition>\n  <div class=\"rule-conditions\">\n    <div class=\"rule-conditions-title\">If <span class=\"input-value\">true</span></div>\n    <div class=\"tree-root\" [attr.aria-hidden]=\"true\">\n      <div></div>\n      <div></div>\n    </div>\n  </div>\n  <div class=\"rule-actions-wrapper\">\n    <div class=\"rule-actions\">\n      <div class=\"rule-action-title success-actions\" tabindex=\"0\"\n          (keyup.enter)=\"successActionsExpanded = !successActionsExpanded\"\n          (click)=\"successActionsExpanded = !successActionsExpanded\">\n        <i class=\"icon refx-icon-validate\">\n        </i>\n        <span>Then</span>\n        <i class=\"icon\"\n          [class.icon-caret-down]=\"!successActionsExpanded\"\n          [class.icon-caret-up]=\"successActionsExpanded\">\n        </i>\n      </div>\n      <o3r-rule-actions-pres class=\"rule-tree-actions\"\n                            *ngIf=\"successActionsExpanded\"\n                            [actions]=\"successElements\">\n      </o3r-rule-actions-pres>\n      <ng-container [ngTemplateOutlet]=\"subTree\" [ngTemplateOutletContext]=\"{blocks: successElements}\"></ng-container>\n    </div>\n  </div>\n</ng-template>\n\n<ng-template #subTree let-blocks=\"blocks\">\n  <div class=\"rule-sub-trees\">\n    <ng-container *ngFor=\"let block of blocks\">\n      <div *ngIf=\"block.blockType === 'IF_ELSE'\" class=\"tree-branch\">\n        <o3r-rule-tree-pres\n          [blockType]=\"'IF_ELSE'\"\n          [condition]=\"block.condition\"\n          [failureElements]=\"block.failureElements\"\n          [successElements]=\"block.successElements\"></o3r-rule-tree-pres>\n      </div>\n    </ng-container>\n  </div>\n</ng-template>\n","import {\n  CommonModule,\n} from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  Input,\n  ViewEncapsulation,\n} from '@angular/core';\nimport type {\n  Ruleset,\n  RulesetExecutionErrorEvent,\n  RulesetExecutionEvent,\n} from '../../../engine';\nimport {\n  RuleActionsPresComponent,\n} from '../rule-actions/rule-actions-pres.component';\nimport {\n  RuleKeyValuePresComponent,\n} from '../rule-key-value/rule-key-value-pres.component';\nimport {\n  RuleTreePresComponent,\n} from '../rule-tree/rule-tree-pres.component';\nimport {\n  O3rFallbackToPipe,\n  O3rJsonOrStringPipe,\n} from '../shared/index';\n\nexport type RulesetExecutionStatus = 'Error' | 'Active' | 'Deactivated' | 'NoEffect';\n/**\n * Model of a RulesetExecution with more information for debug purpose\n */\nexport type RulesetExecutionDebug = (RulesetExecutionEvent | RulesetExecutionErrorEvent) & {\n  isActive: boolean;\n  status: RulesetExecutionStatus;\n  rulesetInformation: Ruleset | undefined;\n};\n\n@Component({\n  selector: 'o3r-ruleset-history-pres',\n  styleUrls: ['./ruleset-history-pres.style.scss'],\n  templateUrl: './ruleset-history-pres.template.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  imports: [\n    CommonModule,\n    O3rFallbackToPipe,\n    O3rJsonOrStringPipe,\n    RuleActionsPresComponent,\n    RuleKeyValuePresComponent,\n    RuleTreePresComponent\n  ]\n})\nexport class RulesetHistoryPresComponent {\n  /**\n   * Reflects the state of each ruleset expanded elements.\n   * Each ruleset entry contains a list of subpanel that can be collapsed or expanded.\n   * Ruleset whole panel status is store the 'ruleset' entry.\n   * @example\n   * Expanded ruleset with rule overview collapsed:\n   * {'rulesetId': {'ruleset' : true, 'ruleOverview': false}}\n   * @note Collapsing a ruleset will not reset the subpanel expansion status\n   */\n  public expansionStatus: { [key: string]: { [subpanel: string]: boolean } } = {};\n\n  @Input()\n  public rulesetExecutions: RulesetExecutionDebug[] = [];\n\n  @Input()\n  public executionDurationFormat = '1.3-3';\n\n  constructor(private readonly cd: ChangeDetectorRef) {}\n\n  /**\n   * Toggle a ruleset subpanel\n   * @param ruleId\n   * @param subpanel element to collapse. 'ruleset' will toggle the whole panel but won't reset the subpanels states.\n   */\n  public toggleExpansion(ruleId: string, subpanel: string) {\n    if (this.expansionStatus[ruleId]) {\n      this.expansionStatus[ruleId][subpanel] = !this.expansionStatus[ruleId][subpanel];\n    } else {\n      this.expansionStatus[ruleId] = { [subpanel]: true };\n    }\n    this.cd.detectChanges();\n  }\n}\n","<section>\n  <ng-template #noRulesEngine>\n    <div class=\"alert alert-danger m-2\" role=\"alert\">\n      The Rules Engine is not configured on this page.\n    </div>\n  </ng-template>\n  <ul *ngIf=\"rulesetExecutions; else noRulesEngine\" class=\"rulesets\">\n    <li *ngFor=\"let execution of rulesetExecutions\" class=\"ruleset\">\n      <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -- need to refactor the div to accordion from DF #1518 -->\n      <div class=\"ruleset-panel-title ruleset-expansion-action\"\n        [class.error]=\"execution.type === 'RulesetExecutionError'\"\n        (click)=\"toggleExpansion(execution.executionId, 'ruleset')\">\n        <div><span [title]=\"'This ruleset has been evaluated ' + execution.executionCounter + ' time(s)'\">{{execution.executionCounter}}</span> - {{execution.rulesetName | titlecase }}\n          <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.linkedComponents?.or\">\n            <ng-container *ngFor=\"let lc of execution.rulesetInformation?.linkedComponents?.or; last as isLast\">\n              <div>{{lc.name}} {{lc.library}} <span *ngIf=\"!isLast\"> OR </span></div>\n            </ng-container>\n          </div>\n          <div class=\"ruleset-panel-subtitle\" *ngIf=\"execution.rulesetInformation?.validityRange as validityRange\">\n            Date range: {{validityRange.from}} - {{validityRange.to}}\n          </div>\n        </div>\n        <div class=\"ruleset-panel-title-aside\">\n          <span class=\"error capsule\" *ngIf=\"execution.status === 'Error'\">Error</span>\n          <span class=\"success capsule\" *ngIf=\"execution.status === 'Active'\">Applied</span>\n          <span class=\"inactive capsule\" *ngIf=\"execution.status === 'Deactivated'\">Deactivated</span>\n          <span class=\"warn capsule\" *ngIf=\"execution.status === 'NoEffect'\">No effect</span>\n          <span class=\"time capsule\">\n            <span>{{execution.timestamp | date: 'HH:mm:ss SSS'}}</span>\n            <span>({{execution.duration | number: executionDurationFormat}}ms)</span>\n          </span>\n          <button\n            class=\"icon\"\n            [class.icon-caret-down]=\"!expansionStatus[execution.executionId]?.ruleset\"\n            [class.icon-caret-up]=\"expansionStatus[execution.executionId]?.ruleset\">\n          </button>\n        </div>\n      </div>\n      <div class=\"ruleset-panel-description\" *ngIf=\"expansionStatus[execution.executionId]?.ruleset\">\n        <ng-container [ngTemplateOutlet]=\"rules\"\n                      [ngTemplateOutletContext]=\"{\n                        rules: execution.rulesetInformation.rules,\n                        expansionID: execution.executionId\n                      }\"></ng-container>\n        <ng-container [ngTemplateOutlet]=\"inputs\"\n                      [ngTemplateOutletContext]=\"{\n                        inputs: execution.inputFacts\n                      }\"></ng-container>\n        <ng-container *ngIf=\"execution.type === 'RulesetExecutionError'; else success\">\n          <div class=\"ruleset-panel-category-title\">Rules:</div>\n          <ul class=\"ruleset-panel-category-body rule-description\">\n            <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n              <ng-container>\n                <div class=\"ruleset-panel-title\" [class.error]=\"ruleEvaluation.error\">\n                  <span>{{ruleEvaluation.rule.name | titlecase}} </span>\n                  <span class=\"capsule error\" *ngIf=\"ruleEvaluation.error\">Error</span>\n                </div>\n                <div>\n                  <ng-container *ngIf=\"ruleEvaluation.error\">\n                    <span class=\"ruleset-panel-category-title\">Error:</span>\n                    <pre class=\"ruleset-panel-category-body error\">{{ruleEvaluation.error | o3rJsonOrString}}</pre>\n                  </ng-container>\n                  <ng-container [ngTemplateOutlet]=\"inputs\"\n                                [ngTemplateOutletContext]=\"{\n                                  inputs: execution.inputFacts,\n                                  runtimeInputs: execution.rulesetInformation?.rules[index]?.inputRuntimeFacts\n                                }\"></ng-container>\n                  <o3r-rule-actions-pres *ngIf=\"!ruleEvaluation.error\"\n                    [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n                    [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\"\n                  ></o3r-rule-actions-pres>\n                </div>\n              </ng-container>\n            </li>\n          </ul>\n        </ng-container>\n        <ng-template #success>\n          <o3r-rule-actions-pres [actions]=\"execution.outputActions\"></o3r-rule-actions-pres>\n          <div class=\"ruleset-panel-category-title\">Executed Rules</div>\n          <ul class=\"rule-description ruleset-panel-category-body\">\n            <li *ngFor=\"let ruleEvaluation of execution.rulesEvaluations; let index=index;\">\n              <div class=\"ruleset-panel-title\">\n                <span>{{ruleEvaluation.rule.name | titlecase}}</span>\n                <span class=\"capsule inactive\" *ngIf=\"ruleEvaluation.cached\">Cached</span>\n                <span class=\"capsule\">({{ruleEvaluation.duration | number: executionDurationFormat}}ms)</span>\n              </div>\n              <div>\n                <ng-container [ngTemplateOutlet]=\"triggers\"\n                              [ngTemplateOutletContext]=\"{triggers: (ruleEvaluation.triggers[ruleEvaluation.rule.id])}\"></ng-container>\n                <o3r-rule-actions-pres\n                  [actions]=\"ruleEvaluation.outputActions\"\n                  [temporaryFacts]=\"ruleEvaluation.temporaryFacts\"\n                  [runtimeOutputs]=\"execution.rulesetInformation?.rules[index]?.outputRuntimeFacts\">\n                </o3r-rule-actions-pres>\n              </div>\n            </li>\n          </ul>\n        </ng-template>\n      </div>\n    </li>\n  </ul>\n</section>\n\n<ng-template let-triggers=\"triggers\" #triggers>\n  <div class=\"ruleset-panel-category-title\">Basefacts Triggers</div>\n  <ul class=\"ruleset-panel-category-body triggers\">\n    <ng-container *ngFor=\"let trigger of (triggers | keyvalue)\">\n      <li *ngIf=\"trigger.value?.factName\">\n        <o3r-rule-key-value-pres\n          [key]=\"trigger.value.factName\"\n          [oldValue]=\"trigger.value.oldValue | o3rFallbackTo\"\n          [value]=\"trigger.value.newValue | o3rFallbackTo\"\n          [type]=\"'state'\"></o3r-rule-key-value-pres>\n      </li>\n    </ng-container>\n  </ul>\n</ng-template>\n\n<ng-template let-rules=\"rules\" let-expansionID=\"expansionID\" #rules>\n  <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -- need to refactor the div to accordion from DF #1518 -->\n  <div class=\"ruleset-panel-category-title ruleset-expansion-action\"\n    (click)=\"toggleExpansion(expansionID, 'rulesOverview')\">\n    <span>Rules Overview</span>\n    <button class=\"icon\"\n            [class.icon-caret-down]=\"!expansionStatus[expansionID]?.rulesOverview\"\n            [class.icon-caret-up]=\"expansionStatus[expansionID]?.rulesOverview\">\n    </button>\n  </div>\n  <ng-container *ngIf=\"expansionStatus[expansionID]?.rulesOverview\">\n    <div *ngIf=\"rules?.length === 0\" class=\"ruleset-panel-category-body empty\">No rule</div>\n    <ul class=\"ruleset-panel-category-body\" *ngIf=\"rules?.length > 0\">\n      <li *ngFor=\"let rule of rules\">\n        <o3r-rule-tree-pres [name]=\"rule.name\"\n                            [condition]=\"rule?.rootElement?.condition\"\n                            [blockType]=\"rule?.rootElement?.blockType\"\n                            [successElements]=\"rule?.rootElement?.successElements\"\n                            [failureElements]=\"rule?.rootElement?.failureElements\">\n        </o3r-rule-tree-pres>\n      </li>\n    </ul>\n  </ng-container>\n</ng-template>\n\n<ng-template let-inputs=\"inputs\" let-runtimeInputs=\"runtimeInputs\" #inputs>\n  <div class=\"ruleset-panel-category-title\">Inputs snapshot</div>\n  <div *ngIf=\"inputs?.length === 0\" class=\"ruleset-panel-category-body empty\">No inputs</div>\n  <ul class=\"ruleset-panel-category-body\" *ngIf=\"inputs?.length > 0\">\n    <li *ngFor=\"let input of inputs\">\n      <o3r-rule-key-value-pres\n        [key]=\"input.factName\"\n        [value]=\"input.value | o3rFallbackTo\"\n        [type]=\"'state'\"></o3r-rule-key-value-pres>\n    </li>\n    <li *ngFor=\"let input of runtimeInputs\">{{input}} (scope limited to ruleset)</li>\n  </ul>\n</ng-template>\n","import {\n  JsonPipe,\n} from '@angular/common';\nimport {\n  NgModule,\n} from '@angular/core';\nimport {\n  RuleConditionPresComponent,\n} from '../rule-condition/rule-condition-pres.component';\nimport {\n  RulesetHistoryPresComponent,\n} from './ruleset-history-pres.component';\n\n/**\n * @deprecated The Components and Pipes are now standalone, this module will be removed in v14\n */\n@NgModule({\n  imports: [\n    JsonPipe,\n    RulesetHistoryPresComponent,\n    RuleConditionPresComponent\n  ],\n  exports: [RulesetHistoryPresComponent]\n})\nexport class RulesetHistoryPresModule {}\n","import type {\n  ConnectContentMessage,\n  DevtoolsCommonOptions,\n  MessageDataTypes,\n  OtterMessageContent,\n  RequestMessagesContentMessage,\n} from '@o3r/core';\nimport type {\n  DebugEvent,\n  Ruleset,\n} from '../engine';\n\nexport interface RulesEngineDevtoolsServiceOptions extends DevtoolsCommonOptions {\n  /** Size of events list emitted by rules engine; When undefined all history will be kept */\n  rulesEngineStackLimit?: number;\n}\n\n/** Rules Engine debug event Message Content */\nexport interface RulesEngineDebugEventsContentMessage extends OtterMessageContent<'rulesEngineEvents'> {\n  /** Map of registered rulesets */\n  rulesetMap: Record<string, Ruleset>;\n  /** List of event from the Rules Engine Debugger */\n  events: DebugEvent[];\n}\n\ntype RulesEngineMessageContents =\n  | RulesEngineDebugEventsContentMessage;\n\n/** List of possible DataTypes for RulesEngine messages */\nexport type RulesEngineMessageDataTypes = MessageDataTypes<RulesEngineMessageContents>;\n\n/** List of all messages for configuration purpose */\nexport type AvailableRulesEngineMessageContents =\n  | RulesEngineMessageContents\n  | ConnectContentMessage\n  | RequestMessagesContentMessage<RulesEngineMessageDataTypes>;\n\nexport const isRulesEngineMessage = (message: any): message is AvailableRulesEngineMessageContents => {\n  return message && (\n    message.dataType === 'rulesEngineEvents'\n    || message.dataType === 'requestMessages'\n    || message.dataType === 'connect'\n  );\n};\n","import {\n  InjectionToken,\n} from '@angular/core';\n\n/** Determine if the action should be executed */\nexport const RULES_ENGINE_OPTIONS = new InjectionToken<boolean>('Rules Engine Options');\n\n/** Rules engine configuration */\nexport interface RulesEngineServiceOptions {\n  /** Determine if the actions resulting of the rule engine should be executed */\n  dryRun: boolean;\n  /** Flag to activate the run of Rules Engine in debug mode */\n  debug: boolean;\n  /** Limit the number of debug events kept in stack */\n  debugEventsStackLimit?: number;\n}\n\n/** Default Rules engine options */\nexport const DEFAULT_RULES_ENGINE_OPTIONS: Readonly<RulesEngineServiceOptions> = {\n  dryRun: false,\n  debug: false\n} as const;\n","import {\n  createAction,\n  props,\n} from '@ngrx/store';\nimport {\n  asyncProps,\n  AsyncRequest,\n  FailAsyncStoreItemEntitiesActionPayload,\n  FromApiActionPayload,\n  SetActionPayload,\n  SetAsyncStoreItemEntitiesActionPayload,\n  UpdateActionPayload,\n} from '@o3r/core';\nimport {\n  RulesetsModel,\n  RulesetsStateDetails,\n} from './rulesets.state';\n\n/** StateDetailsActions */\nconst ACTION_SET = '[Rulesets] set';\nconst ACTION_UPDATE = '[Rulesets] update';\nconst ACTION_RESET = '[Rulesets] reset';\nconst ACTION_CANCEL_REQUEST = '[Rulesets] cancel request';\n\n/** Entity Actions */\nconst ACTION_CLEAR_ENTITIES = '[Rulesets] clear entities';\nconst ACTION_UPSERT_ENTITIES = '[Rulesets] upsert entities';\nconst ACTION_SET_ENTITIES = '[Rulesets] set entities';\nconst ACTION_FAIL_ENTITIES = '[Rulesets] fail entities';\n\n/** Async Actions */\nconst ACTION_SET_ENTITIES_FROM_API = '[Rulesets] set entities from api';\nconst ACTION_UPSERT_ENTITIES_FROM_API = '[Rulesets] upsert entities from api';\n\n/** Action to clear the StateDetails of the store and replace it */\nexport const setRulesets = createAction(ACTION_SET, props<SetActionPayload<RulesetsStateDetails>>());\n\n/** Action to change a part or the whole object in the store. */\nexport const updateRulesets = createAction(ACTION_UPDATE, props<UpdateActionPayload<RulesetsStateDetails>>());\n\n/** Action to reset the whole state, by returning it to initial state. */\nexport const resetRulesets = createAction(ACTION_RESET);\n\n/** Action to cancel a Request ID registered in the store. Can happen from effect based on a switchMap for instance */\nexport const cancelRulesetsRequest = createAction(ACTION_CANCEL_REQUEST, props<AsyncRequest>());\n\n/** Action to clear all rulesets and fill the store with the payload */\nexport const setRulesetsEntities = createAction(ACTION_SET_ENTITIES, props<SetAsyncStoreItemEntitiesActionPayload<RulesetsModel>>());\n\n/** Action to update rulesets with known IDs, insert the new ones */\nexport const upsertRulesetsEntities = createAction(ACTION_UPSERT_ENTITIES, props<SetAsyncStoreItemEntitiesActionPayload<RulesetsModel>>());\n\n/** Action to empty the list of entities, keeping the global state */\nexport const clearRulesetsEntities = createAction(ACTION_CLEAR_ENTITIES);\n\n/** Action to update failureStatus for every RulesetsModel */\nexport const failRulesetsEntities = createAction(ACTION_FAIL_ENTITIES, props<FailAsyncStoreItemEntitiesActionPayload<any>>());\n\n/**\n * Action to put the global status of the store in a pending state. Call SET action with the list of RulesetsModels received, when this action resolves.\n * If the call fails, dispatch FAIL_ENTITIES action\n */\nexport const setRulesetsEntitiesFromApi = createAction(ACTION_SET_ENTITIES_FROM_API, asyncProps<FromApiActionPayload<RulesetsModel[]>>());\n\n/**\n * Action to put global status of the store in a pending state. Call UPSERT action with the list of RulesetsModels received, when this action resolves.\n * If the call fails, dispatch FAIL_ENTITIES action\n */\nexport const upsertRulesetsEntitiesFromApi = createAction(ACTION_UPSERT_ENTITIES_FROM_API, asyncProps<FromApiActionPayload<RulesetsModel[]>>());\n","import {\n  Injectable,\n} from '@angular/core';\nimport {\n  Actions,\n  createEffect,\n  ofType,\n} from '@ngrx/effects';\nimport {\n  fromApiEffectSwitchMap,\n} from '@o3r/core';\nimport {\n  from,\n  of,\n} from 'rxjs';\nimport {\n  catchError,\n  map,\n  mergeMap,\n} from 'rxjs/operators';\nimport {\n  cancelRulesetsRequest,\n  failRulesetsEntities,\n  setRulesetsEntities,\n  setRulesetsEntitiesFromApi,\n  upsertRulesetsEntities,\n  upsertRulesetsEntitiesFromApi,\n} from './rulesets.actions';\n\n/**\n * Service to handle async Rulesets actions\n */\n@Injectable()\nexport class RulesetsEffect {\n  /**\n   * Set the entities with the reply content, dispatch failRulesetsEntities if it catches a failure\n   */\n  public setEntitiesFromApi$ = createEffect(() =>\n    this.actions$.pipe(\n      ofType(setRulesetsEntitiesFromApi),\n      fromApiEffectSwitchMap(\n        (reply, action) => setRulesetsEntities({ entities: reply, requestId: action.requestId }),\n        (error, action) => of(failRulesetsEntities({ error, requestId: action.requestId })),\n        cancelRulesetsRequest\n      )\n    )\n  );\n\n  /**\n   * Upsert the entities with the reply content, dispatch failRulesetsEntities if it catches a failure\n   */\n  public upsertEntitiesFromApi$ = createEffect(() =>\n    this.actions$.pipe(\n      ofType(upsertRulesetsEntitiesFromApi),\n      mergeMap((payload) =>\n        from(payload.call).pipe(\n          map((reply) => upsertRulesetsEntities({ entities: reply, requestId: payload.requestId })),\n          catchError((err) => of(failRulesetsEntities({ error: err, requestId: payload.requestId })))\n        )\n      )\n    )\n  );\n\n  constructor(protected actions$: Actions) {}\n}\n","import {\n  createEntityAdapter,\n} from '@ngrx/entity';\nimport {\n  ActionCreator,\n  createReducer,\n  on,\n  ReducerTypes,\n} from '@ngrx/store';\nimport {\n  asyncStoreItemAdapter,\n} from '@o3r/core';\nimport * as actions from './rulesets.actions';\nimport {\n  RulesetsModel,\n  RulesetsState,\n  RulesetsStateDetails,\n} from './rulesets.state';\n\n/**\n * Rulesets Store adapter\n */\nexport const rulesetsAdapter = createEntityAdapter<RulesetsModel>({\n  selectId: (model) => model.id\n});\n\n/**\n * Rulesets Store initial value\n */\nexport const rulesetsInitialState: RulesetsState = rulesetsAdapter.getInitialState<RulesetsStateDetails>({\n  requestIds: []\n});\n\n/**\n * List of basic actions for Rulesets Store\n */\nexport const rulesetsReducerFeatures: ReducerTypes<RulesetsState, ActionCreator[]>[] = [\n  on(actions.resetRulesets, () => rulesetsInitialState),\n\n  on(actions.setRulesets, (state, payload) => ({ ids: state.ids, entities: state.entities, ...payload.stateDetails })),\n\n  on(actions.cancelRulesetsRequest, (state, action) => asyncStoreItemAdapter.resolveRequest(state, action.requestId)),\n\n  on(actions.updateRulesets, (state, payload) => ({ ...state, ...payload.stateDetails })),\n\n  on(actions.setRulesetsEntities, (state, payload) =>\n    rulesetsAdapter.addMany(\n      payload.entities,\n      rulesetsAdapter.removeAll(asyncStoreItemAdapter.resolveRequest(state, payload.requestId)))\n  ),\n\n  on(actions.upsertRulesetsEntities, (state, payload) =>\n    rulesetsAdapter.upsertMany(payload.entities, asyncStoreItemAdapter.resolveRequest(state, payload.requestId))\n  ),\n\n  on(actions.clearRulesetsEntities, (state) => rulesetsAdapter.removeAll(state)),\n\n  on(actions.failRulesetsEntities, (state, payload) =>\n    asyncStoreItemAdapter.failRequest(state, payload.requestId)\n  ),\n\n  on(actions.setRulesetsEntitiesFromApi, actions.upsertRulesetsEntitiesFromApi, (state, payload) =>\n    asyncStoreItemAdapter.addRequest(state, payload.requestId))\n];\n\n/**\n * Rulesets Store reducer\n */\nexport const rulesetsReducer = createReducer(\n  rulesetsInitialState,\n  ...rulesetsReducerFeatures\n);\n","import {\n  EntityState,\n} from '@ngrx/entity';\nimport {\n  AsyncStoreItem,\n} from '@o3r/core';\nimport type {\n  Ruleset,\n} from '../../engine';\n\n/**\n * Rulesets model\n */\nexport interface RulesetsModel extends Ruleset {\n}\n\n/**\n * Rulesets state details\n */\nexport interface RulesetsStateDetails extends AsyncStoreItem {\n}\n\n/**\n * Rulesets store state\n */\nexport interface RulesetsState extends EntityState<RulesetsModel>, RulesetsStateDetails {\n}\n\n/**\n * Name of the Rulesets Store\n */\nexport const RULESETS_STORE_NAME = 'rulesets';\n\n/**\n * Rulesets Store Interface\n */\nexport interface RulesetsStore {\n  /** Rulesets state */\n  [RULESETS_STORE_NAME]: RulesetsState;\n}\n","import {\n  InjectionToken,\n  ModuleWithProviders,\n  NgModule,\n} from '@angular/core';\nimport {\n  EffectsModule,\n} from '@ngrx/effects';\nimport {\n  Action,\n  ActionReducer,\n  StoreModule,\n} from '@ngrx/store';\nimport {\n  RulesetsEffect,\n} from './rulesets.effect';\nimport {\n  rulesetsReducer,\n} from './rulesets.reducer';\nimport {\n  RULESETS_STORE_NAME,\n  RulesetsState,\n} from './rulesets.state';\n\n/** Token of the Rulesets reducer */\nexport const RULESETS_REDUCER_TOKEN = new InjectionToken<ActionReducer<RulesetsState, Action>>('Feature Rulesets Reducer');\n\n/** Provide default reducer for Rulesets store */\nexport function getDefaultRulesetsReducer() {\n  return rulesetsReducer;\n}\n\n@NgModule({\n  imports: [\n    StoreModule.forFeature(RULESETS_STORE_NAME, RULESETS_REDUCER_TOKEN), EffectsModule.forFeature([RulesetsEffect])\n  ],\n  providers: [\n    { provide: RULESETS_REDUCER_TOKEN, useFactory: getDefaultRulesetsReducer }\n  ]\n})\nexport class RulesetsStoreModule {\n  public static forRoot<T extends RulesetsState>(reducerFactory: () => ActionReducer<T, Action>): ModuleWithProviders<RulesetsStoreModule> {\n    return {\n      ngModule: RulesetsStoreModule,\n      providers: [\n        { provide: RULESETS_REDUCER_TOKEN, useFactory: reducerFactory }\n      ]\n    };\n  }\n}\n","import {\n  createFeatureSelector,\n  createSelector,\n} from '@ngrx/store';\nimport {\n  computeItemIdentifier,\n} from '@o3r/core';\nimport type {\n  Ruleset,\n} from '../../engine';\nimport {\n  rulesetsAdapter,\n} from './rulesets.reducer';\nimport {\n  RULESETS_STORE_NAME,\n  RulesetsState,\n} from './rulesets.state';\n\nconst { selectIds, selectEntities, selectAll, selectTotal } = rulesetsAdapter.getSelectors();\n\n/** Select Rulesets State */\nexport const selectRulesetsState = createFeatureSelector<RulesetsState>(RULESETS_STORE_NAME);\n\n/** Select the array of Rulesets ids */\nexport const selectRulesetsIds = createSelector(selectRulesetsState, selectIds);\n\n/** Select the array of Rulesets */\nexport const selectAllRulesets = createSelector(selectRulesetsState, selectAll);\n\n/** Select the dictionary of Rulesets entities */\nexport const selectRulesetsEntities = createSelector(selectRulesetsState, selectEntities);\n\n/** Select the total Rulesets count */\nexport const selectRulesetsTotal = createSelector(selectRulesetsState, selectTotal);\n\n/** Select the store pending status */\nexport const selectRulesetsStorePendingStatus = createSelector(selectRulesetsState, (state) => state.isPending || false);\n\n/**\n * Check if the given value is a valid date\n * @param d\n */\nconst isValidDate = (d: any) => !Number.isNaN(d) && d instanceof Date;\n\n/**\n * Returns the rulesets which are in the validity range, if provided\n */\nexport const selectRuleSetsInRange = createSelector(\n  selectAllRulesets,\n  (ruleSets) => ruleSets.filter((ruleSet: Ruleset) => {\n    const validity = ruleSet.validityRange;\n    if (!validity || (!validity.from && !validity.to)) {\n      return true;\n    }\n\n    const from = validity.from && new Date(validity.from);\n    const to = validity.to && new Date(validity.to);\n\n    if ((to && !isValidDate(to)) || (from && !isValidDate(from))) {\n      return false;\n    }\n    const time = Date.now();\n    if (to && from) {\n      return from.getTime() <= time && to.getTime() >= time;\n    }\n\n    if (from) {\n      return from.getTime() <= time;\n    }\n    return to && to.getTime() >= time;\n  })\n);\n\n/**\n * Returns the rulesets ids which are not onDemand and in the validity range\n */\nexport const selectActiveRuleSets = createSelector(\n  selectRuleSetsInRange,\n  (ruleSets) => ruleSets\n    .filter((ruleSet: Ruleset) => (!ruleSet.linkedComponents?.or?.length))\n    .map((ruleSet: Ruleset) => ruleSet.id));\n\n/**\n * Assign component to RulesetIds Map\n * @param compName\n * @param library\n * @param ruleSetId\n * @param acc\n */\nfunction linkComponentToRuleset(compName: string, library: string, ruleSetId: string, acc: Record<string, string[]> = {}) {\n  const configName = computeItemIdentifier(compName, library);\n  acc[ruleSetId] ||= [];\n  acc[ruleSetId].push(configName);\n}\n\n/**\n * Select the map of ruleSets to activate based on linked components\n */\nexport const selectComponentsLinkedToRuleset = createSelector(\n  selectRuleSetsInRange,\n  (ruleSets) =>\n    ruleSets\n      .reduce((acc: { or: { [key: string]: string[] } }, ruleSet: Ruleset) => {\n        if (!ruleSet.linkedComponents?.or || ruleSet.linkedComponents.or.length === 0) {\n          return acc;\n        }\n        if (ruleSet.linkedComponents?.or?.length) {\n          ruleSet.linkedComponents.or.forEach((linkComp) => {\n            linkComponentToRuleset(linkComp.name, linkComp.library, ruleSet.id, acc.or);\n          });\n          return acc;\n        }\n        return acc;\n      }, { or: {} })\n);\n","import {\n  asyncStoreItemAdapter,\n  Serializer,\n} from '@o3r/core';\nimport {\n  rulesetsAdapter,\n  rulesetsInitialState,\n} from './rulesets.reducer';\nimport {\n  RulesetsModel,\n  RulesetsState,\n} from './rulesets.state';\n\nexport const rulesetsStorageSerializer = (state: RulesetsState) => {\n  return asyncStoreItemAdapter.clearAsyncStoreItem(state);\n};\n\nexport const rulesetsStorageDeserializer = (rawObject: any) => {\n  if (!rawObject || !rawObject.ids) {\n    return rulesetsInitialState;\n  }\n  const storeObject = rulesetsAdapter.getInitialState(rawObject);\n  for (const id of rawObject.ids) {\n    storeObject.entities[id] = rawObject.entities[id] as RulesetsModel;\n  }\n  return storeObject;\n};\n\nexport const rulesetsStorageSync: Serializer<RulesetsState> = {\n  serialize: rulesetsStorageSerializer,\n  deserialize: rulesetsStorageDeserializer\n};\n","import {\n  EvaluationReason,\n  RuleEvaluation,\n  RuleEvaluationOutput,\n} from '../engine.interface';\nimport type {\n  Facts,\n} from '../fact';\nimport {\n  ActionBlock,\n  Rule,\n} from '../structure';\n\n/**\n * Function to retrieve from 2 sequential executions only the triggers which activated the last ruleset execution\n * @param currRes Current ruleset execution object\n * @param prevRes Previous ruleset execution object\n * @returns The triggers list which activates the last ruleset execution\n */\nexport function retrieveRulesetTriggers(currRes: RuleEvaluationOutput[], prevRes: RuleEvaluationOutput[] | undefined) {\n  let rulesetTriggers: Record<string, Record<string, EvaluationReason>> = {};\n\n  const allCurrRulesetTriggersList = currRes.map((r) => r.evaluation).filter((e): e is RuleEvaluation => !!e).map((e) => e.triggers);\n  const allCurrRulesetTriggers: Record<string, Record<string, EvaluationReason>> = {};\n\n  allCurrRulesetTriggersList.forEach((rTrig) => {\n    Object.keys(rTrig).forEach((ruleId) => {\n      allCurrRulesetTriggers[ruleId] = rTrig[ruleId];\n    });\n  });\n\n  if (prevRes) {\n    const allPrevRulesetTriggersList = prevRes.map((r) => r.evaluation).filter((e): e is RuleEvaluation => !!e).map((e) => e.triggers);\n    const allPrevRulesetTriggers: Record<string, Record<string, EvaluationReason>> = {};\n\n    allPrevRulesetTriggersList.forEach((rTrig) => {\n      Object.keys(rTrig).forEach((ruleId) => {\n        allPrevRulesetTriggers[ruleId] = rTrig[ruleId];\n      });\n    });\n\n    Object.entries(allCurrRulesetTriggers).forEach(([ruleId, ruleTriggers]) => {\n      Object.keys(ruleTriggers).forEach((factName) => {\n        if (!allPrevRulesetTriggers[ruleId]\n          || !allPrevRulesetTriggers[ruleId][factName]\n          || ruleTriggers[factName].newValue !== allPrevRulesetTriggers[ruleId][factName].newValue) {\n          (rulesetTriggers[ruleId] ||= {})[factName] = ruleTriggers[factName];\n        }\n      });\n    });\n  } else {\n    rulesetTriggers = allCurrRulesetTriggers;\n  }\n  return rulesetTriggers;\n}\n\n/**\n * Flag as cached the rules evaluations which are from previous ruleset executions\n * @param rulesEvaluations all rules evaluations list\n * @param triggers Ruleset triggers object\n * @returns Rules evaluation list with flagged rules evaluation from previous ruleset executions\n */\nexport function flagCachedRules(rulesEvaluations: RuleEvaluation[], triggers: Record<string, Record<string, EvaluationReason>>): (RuleEvaluation & { cached?: boolean })[] {\n  const rulesWhichTriggeredExecution = Object.keys(triggers);\n\n  return rulesEvaluations.map((e) => {\n    if (e && !rulesWhichTriggeredExecution.includes(e.rule.id)) {\n      return { ...e, cached: true };\n    }\n    return { ...e };\n  });\n}\n\n/**\n * Create the debug rule evaluation object\n * @param rule\n * @param rulesetName\n * @param outputActions\n * @param outputError\n * @param runtimeFactValues\n * @param factValues\n * @param oldFactValues\n * @param inputFacts\n */\nexport function handleRuleEvaluationDebug(\n  rule: Rule,\n  rulesetName: string,\n  outputActions: ActionBlock[] | undefined,\n  outputError: any,\n  runtimeFactValues: Record<string, Facts>,\n  factValues: any[] | undefined,\n  oldFactValues: any[] | undefined,\n  inputFacts: string[] | undefined = []\n) {\n  const executionId = `${rulesetName} - ${rule.name}`;\n\n  const reasons: Record<string, Record<string, EvaluationReason>> = {};\n  for (let index = 0; index < factValues!.length; index++) {\n    if (!oldFactValues) {\n      (reasons[rule.id] ||= {})[inputFacts[index]] = { factName: inputFacts[index], newValue: factValues![index] };\n    } else if (oldFactValues[index]?.toString() !== factValues![index]?.toString()) {\n      (reasons[rule.id] ||= {})[inputFacts[index]] = { factName: inputFacts[index], oldValue: oldFactValues[index], newValue: factValues![index] };\n    }\n  }\n\n  const ruleEvaluation: RuleEvaluation = {\n    timestamp: Date.now(),\n    outputActions,\n    id: executionId,\n    triggers: reasons,\n    temporaryFacts: rule.outputRuntimeFacts.concat(rule.inputRuntimeFacts).reduce<Record<string, Facts>>((acc, runtimeFactName) => {\n      if (typeof runtimeFactValues[runtimeFactName] !== 'undefined') {\n        acc[runtimeFactName] = runtimeFactValues[runtimeFactName];\n      }\n      return acc;\n    }, {}\n    ),\n    rule: { id: rule.id, name: rule.name },\n    ...(outputError ? { error: outputError } : {})\n  };\n  return ruleEvaluation;\n}\n","import {\n  Observable,\n  ReplaySubject,\n} from 'rxjs';\nimport {\n  concatMap,\n  share,\n  shareReplay,\n  startWith,\n  tap,\n  withLatestFrom,\n} from 'rxjs/operators';\nimport type {\n  RulesEngine,\n} from '../engine';\nimport {\n  BaseRulesetExecution,\n  DebugEvent,\n  EvaluationReason,\n  RuleEvaluation,\n  RuleEvaluationOutput,\n  RulesetExecutionErrorEvent,\n  RulesetExecutionEvent,\n} from '../engine.interface';\nimport type {\n  Facts,\n} from '../fact';\nimport {\n  RulesetExecutor,\n} from '../ruleset-executor';\nimport type {\n  ActionBlock,\n  Ruleset,\n} from '../structure';\nimport {\n  flagCachedRules,\n  retrieveRulesetTriggers,\n} from './helpers';\n\nexport interface EngineDebuggerOptions {\n  /**\n   * Limit of events to keep in the stack before subscribing to the debugEvents$ stream.\n   * @default undefined no limit\n   */\n  eventsStackLimit?: number;\n}\n\n/**\n * Rules engine debugger object to emit debug events\n */\nexport class EngineDebugger {\n  private registeredRuleEngine?: RulesEngine;\n\n  private registeredRulesets: Pick<Ruleset, 'name' | 'id'>[] = [];\n\n  // Keep a small history in case the events$ stream from the engine is subscribed after rules engine initialization\n  private readonly debugEventsSubject$: ReplaySubject<() => (Promise<DebugEvent> | DebugEvent)>;\n\n  private performanceMeasures$!: Observable<PerformanceMeasure[]>;\n\n  /** Stream emitting a debug event when is fired; timeline is kept */\n  public readonly debugEvents$: Observable<DebugEvent>;\n\n  /** Retrieved the rules engine plugged to the debugger */\n  public get rulesEngine(): RulesEngine | undefined {\n    return this.registeredRuleEngine;\n  }\n\n  /**\n   * Instantiate a rules engine debugger\n   * @param options Options to configure the debugger\n   */\n  constructor(options?: EngineDebuggerOptions) {\n    this.debugEventsSubject$ = new ReplaySubject<() => (Promise<DebugEvent> | DebugEvent)>(options?.eventsStackLimit);\n    this.initializePerformanceObserver();\n    this.debugEvents$ = this.debugEventsSubject$.pipe(\n      withLatestFrom(this.performanceMeasures$),\n      concatMap(async ([eventFunc, performanceMeasures]) => {\n        const debugEvent: DebugEvent = await eventFunc();\n        if (debugEvent.type === 'RulesetExecution' || debugEvent.type === 'RulesetExecutionError') {\n          let rulesetDuration = 0;\n          debugEvent.rulesEvaluations.forEach((rule) => {\n            const mark = `rules-engine:${\n              this.registeredRuleEngine?.rulesEngineInstanceName || ''\n            }:${debugEvent.rulesetName}:${rule.rule.name}`;\n            const measures = performanceMeasures.filter((m) => m.name === mark);\n            const duration = measures.at(-1)?.duration || 0;\n            rule.duration = duration;\n            rulesetDuration += duration;\n          });\n          debugEvent.duration = rulesetDuration;\n        }\n        return debugEvent;\n      }),\n      tap((debugEvent) => {\n        if (debugEvent.type === 'RulesetExecution') {\n          this.rulesEngine?.logger?.debug?.(`${debugEvent.rulesetName} has been triggered and resulted in ${JSON.stringify(debugEvent.outputActions)}`);\n        }\n      }),\n      share()\n    );\n  }\n\n  private initializePerformanceObserver() {\n    this.performanceMeasures$ = new Observable<PerformanceMeasure[]>((subscriber) => {\n      const performanceObserver = new PerformanceObserver((list) => {\n        subscriber.next(list.getEntries() as PerformanceMeasure[]);\n      });\n      performanceObserver.observe({ entryTypes: ['measure'] });\n      return () => performanceObserver.disconnect();\n    }).pipe(startWith([]), shareReplay(1));\n  }\n\n  private async createBaseExecutionOutputObject(ruleset: Ruleset, executionCounter: number,\n    rulesetInputFacts: string[], runtimeFactValues: Record<string, Facts>,\n    rulesetTriggers: Record<string, Record<string, EvaluationReason>>, rulesExecutions: RuleEvaluation[]) {\n    const inputFacts = await this.getFactsSnapshot(rulesetInputFacts);\n\n    const baseRulesetOutputExecution: BaseRulesetExecution = {\n      executionCounter,\n      executionId: `${ruleset.id}-${executionCounter}`,\n      rulesetId: ruleset.id,\n      rulesetName: ruleset.name,\n      inputFacts,\n      triggers: rulesetTriggers,\n      rulesEvaluations: flagCachedRules(rulesExecutions?.sort((a, b) => a.timestamp - b.timestamp) || [], rulesetTriggers),\n      temporaryFacts: runtimeFactValues\n    };\n    return baseRulesetOutputExecution;\n  }\n\n  private async rulesetExecution(\n    timestamp: number,\n    ruleset: Ruleset,\n    executionCounter: number,\n    rulesetInputFacts: string[],\n    allOutputActions: ActionBlock[],\n    runtimeFactValues: Record<string, Facts>,\n    rulesetTriggers: Record<string, Record<string, EvaluationReason>>,\n    rulesExecutions: RuleEvaluation[]) {\n    const baseRulesetOutputExecution = await this.createBaseExecutionOutputObject(ruleset, executionCounter, rulesetInputFacts, runtimeFactValues, rulesetTriggers, rulesExecutions);\n\n    const rulesetOutputExecution: RulesetExecutionEvent = {\n      timestamp,\n      type: 'RulesetExecution',\n      outputActions: allOutputActions,\n      ...baseRulesetOutputExecution\n    };\n\n    return rulesetOutputExecution;\n  }\n\n  private async rulesetExecutionError(\n    timestamp: number,\n    ruleset: Ruleset,\n    rulesetInputFacts: string[],\n    executionCounter: number,\n    runtimeFactValues: Record<string, Facts>,\n    rulesetTriggers: Record<string, Record<string, EvaluationReason>>,\n    rulesExecutions: RuleEvaluation[]\n  ) {\n    const baseRulesetOutputExecution = await this.createBaseExecutionOutputObject(ruleset, executionCounter, rulesetInputFacts, runtimeFactValues, rulesetTriggers, rulesExecutions);\n\n    const rulesExecWithErrors = rulesExecutions.filter((ex) => !!ex && !!ex.error);\n    const rulesetOutputExecutionSkip: RulesetExecutionErrorEvent = {\n      timestamp,\n      type: 'RulesetExecutionError',\n      rulesCausingTheError: rulesExecWithErrors.map((e) => e.rule) || [],\n      errors: rulesExecWithErrors.map((e) => e.error),\n      ...baseRulesetOutputExecution\n    };\n    return rulesetOutputExecutionSkip;\n  }\n\n  /**\n   * Plug the debugger to a Rule Engine\n   * @param rulesEngine\n   */\n  public registerRuleEngine(rulesEngine: RulesEngine) {\n    this.registeredRuleEngine = rulesEngine;\n  }\n\n  /**\n   * Handle ruleset execution debug info\n   * @param currRes\n   * @param prevRes\n   * @param allExecutionsValid\n   * @param rulesetInputFacts\n   * @param runtimeFactValues\n   * @param executionCounter\n   * @param ruleset\n   */\n  public handleDebugRulesetExecutionInfo(\n    currRes: RuleEvaluationOutput[],\n    prevRes: RuleEvaluationOutput[] | undefined,\n    allExecutionsValid: boolean,\n    rulesetInputFacts: string[],\n    runtimeFactValues: Record<string, Facts>,\n    executionCounter: number,\n    ruleset: Ruleset) {\n    const rulesetTriggers = retrieveRulesetTriggers(currRes, prevRes);\n    const rulesetOutputExecution = currRes.map((r) => r.evaluation!);\n\n    if (!allExecutionsValid) {\n      this.addRulesetExecutionErrorEvent(ruleset, rulesetInputFacts, executionCounter, runtimeFactValues, rulesetTriggers, rulesetOutputExecution);\n    }\n\n    return {\n      executionCounter,\n      rulesetOutputExecution,\n      allExecutionsValid,\n      rulesetTriggers\n    };\n  }\n\n  /**\n   * Emits an 'AvailableRulesets' debug event when rulesets are registered to the rules engine\n   * @param rulesets\n   */\n  public addAvailableRulesets(rulesets: Ruleset[]) {\n    const timestamp = Date.now();\n    this.registeredRulesets = [...this.registeredRulesets, ...rulesets.map((r) => ({ name: r.name, id: r.id }))];\n    this.debugEventsSubject$.next(() => ({\n      timestamp,\n      type: 'AvailableRulesets',\n      availableRulesets: this.registeredRulesets\n    }));\n  }\n\n  /**\n   * Computes and emits an 'ActiveRulesets' debug event when the active rulesets are changing\n   * @param ruleSetExecutorMap map off all rulesets executors\n   * @param restrictiveRuleSets ids of the rulesets to activate; if not provided all registered rulesets will be considered as active\n   */\n  public activeRulesetsChange(ruleSetExecutorMap: Record<string, RulesetExecutor>, restrictiveRuleSets?: string[]) {\n    const timestamp = Date.now();\n    const rulesets = Object.keys(ruleSetExecutorMap).map((rulesetId) => ruleSetExecutorMap[rulesetId].engineRuleset);\n    const activeRulesets = restrictiveRuleSets\n      ? Object.values(rulesets).filter((ruleSet) => restrictiveRuleSets.includes(ruleSet.id))\n      : Object.values(rulesets);\n\n    this.debugEventsSubject$.next(() => ({\n      timestamp,\n      type: 'ActiveRulesets',\n      rulesets: activeRulesets.map((a) => ({ name: ruleSetExecutorMap[a.id].ruleset.name, id: ruleSetExecutorMap[a.id].ruleset.id }))\n    }));\n  }\n\n  /**\n   * Emits an 'AllActions' debug event each time the rules engine outputs the list of actions\n   * @param actions list of outputted actions\n   */\n  public allActionsChange(actions: ActionBlock[]) {\n    const timestamp = Date.now();\n    this.debugEventsSubject$.next(() => ({ timestamp, type: 'AllActions', actions }));\n  }\n\n  /**\n   * Emits a 'RulesetExecution' debug event at the output of a successful ruleset execution\n   * @param ruleset\n   * @param executionCounter\n   * @param rulesetInputFacts\n   * @param allOutputActions\n   * @param runtimeFactValues\n   * @param rulesetTriggers\n   * @param rulesExecutions\n   */\n  public addRulesetExecutionEvent(ruleset: Ruleset, executionCounter: number,\n    rulesetInputFacts: string[], allOutputActions: ActionBlock[], runtimeFactValues: Record<string, Facts>,\n    rulesetTriggers: Record<string, Record<string, EvaluationReason>>, rulesExecutions: RuleEvaluation[]) {\n    const timestamp = Date.now();\n    this.debugEventsSubject$.next(() => this.rulesetExecution(timestamp, ruleset, executionCounter,\n      rulesetInputFacts, allOutputActions, runtimeFactValues, rulesetTriggers, rulesExecutions));\n  }\n\n  /**\n   * Emits a 'RulesetExecutionError' debug event at the output of a failing ruleset execution\n   * @param ruleset\n   * @param rulesetInputFacts\n   * @param executionCounter\n   * @param runtimeFactValues\n   * @param rulesetTriggers\n   * @param rulesExecutions\n   */\n  public addRulesetExecutionErrorEvent(\n    ruleset: Ruleset,\n    rulesetInputFacts: string[],\n    executionCounter: number,\n    runtimeFactValues: Record<string, Facts>,\n    rulesetTriggers: Record<string, Record<string, EvaluationReason>>,\n    rulesExecutions: RuleEvaluation[]\n  ) {\n    const timestamp = Date.now();\n    this.debugEventsSubject$.next(() => this.rulesetExecutionError(timestamp, ruleset, rulesetInputFacts, executionCounter, runtimeFactValues, rulesetTriggers, rulesExecutions));\n  }\n\n  /**\n   * Emits a 'AvailableFactsSnapshot' debug event when a fact value is updated\n   * @param _id\n   * @param factValue$\n   */\n  public addAvailableFactsSnapshotEvent(\n    _id: string,\n    factValue$: Observable<any>\n  ) {\n    factValue$.subscribe(async () => {\n      const timestamp = Date.now();\n      const facts = await this.getFactsSnapshot(this.registeredRuleEngine!.getRegisteredFactsNames());\n      this.debugEventsSubject$.next(() => ({\n        timestamp,\n        type: 'AvailableFactsSnapshot',\n        facts\n      }));\n    });\n  }\n\n  /**\n   * Returns a list of fact name and value pairs\n   * @param factsNames List of facts names to get the value for\n   */\n  public async getFactsSnapshot(factsNames: string[]) {\n    const facts: { factName: string; value: any }[] = [];\n    if (!this.registeredRuleEngine) {\n      throw new Error('Rule engine not plugged to the debugger');\n    }\n    for (const factName of factsNames) {\n      facts.push({ factName, value: await this.registeredRuleEngine.retrieveFactValue(factName) });\n    }\n    return facts;\n  }\n}\n","import {\n  combineLatest,\n  Observable,\n  of,\n} from 'rxjs';\nimport {\n  map,\n  shareReplay,\n  switchMap,\n} from 'rxjs/operators';\nimport {\n  RulesetExecutor,\n} from '../ruleset-executor';\n\n/**\n * Filter the actions outputted by the rules engine, based on active rulesets\n * @param restrictiveRuleSets list of rules sets to get the event stream for\n */\nexport function filterRulesetsEventStream(restrictiveRuleSets?: string[]) {\n  return (source$: Observable<Record<string, RulesetExecutor>>) => source$.pipe(\n    switchMap((ruleSetExecutorMap) => {\n      const rulesets = Object.keys(ruleSetExecutorMap).map((rulesetId) => ruleSetExecutorMap[rulesetId].engineRuleset);\n      const activeRulesets = restrictiveRuleSets\n        ? Object.values(rulesets).filter((ruleSet) => restrictiveRuleSets.includes(ruleSet.id))\n        : Object.values(rulesets);\n\n      return activeRulesets?.length > 0\n        ? combineLatest(activeRulesets.map((ruleset) => ruleset.rulesResultsSubject$)).pipe(\n          map((item) => item.reduce((acc, currentValue) => {\n            acc.push(...currentValue);\n            return acc;\n          }, [])))\n        : of([]);\n    }),\n    shareReplay(1)\n  );\n}\n","import type {\n  Facts,\n} from '../fact';\nimport {\n  DateInput,\n  Operator,\n  SupportedSimpleTypes,\n} from './operator.interface';\n\n/**\n * Execute Operator\n * @param lhs Left hand side\n * @param rhs Right hand side\n * @param operator Operator to compare values\n * @param operatorFacts Facts that operator can depend on\n */\nexport function executeOperator<L = unknown, R = unknown>(lhs: L, rhs: R, operator: Operator<L, R>, operatorFacts?: Record<string, Facts | undefined>) {\n  const validLhs = (!operator.validateLhs || operator.validateLhs(lhs));\n  const validRhs = (!operator.validateRhs || operator.validateRhs(rhs));\n  let operatorFactValues: Record<string, Facts> | undefined;\n  if (operatorFacts && operator.factImplicitDependencies) {\n    operatorFactValues = operator.factImplicitDependencies.reduce((acc, dep) => {\n      if (operatorFacts[dep]) {\n        acc[dep] = operatorFacts[dep]!;\n      } else {\n        throw new Error(`The fact \"${dep}\" requested by ${operator.name} cannot be found.`);\n      }\n      return acc;\n    }, {} as Record<string, Facts>);\n  }\n  if (!validLhs) {\n    throw new Error(`Invalid left operand: ${JSON.stringify(lhs)}`);\n  }\n  if (!validRhs) {\n    throw new Error(`Invalid right operand: ${JSON.stringify(rhs)}`);\n  }\n  const obs = operator.evaluator(lhs, rhs, operatorFactValues);\n  return obs;\n}\n\n/**\n * Validate a number operand\n * @param operand value of one of the operands\n */\nexport function numberValidator(operand: unknown): operand is number | string {\n  // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- needed to convert any variable in a number (or NaN)\n  return operand !== '' && !Array.isArray(operand) && !Number.isNaN(+`${operand}`);\n}\n\n/**\n * Validate an operand is a range of numbers\n * @param operatorInput value of one of the operands\n */\nexport function isRangeNumber(operatorInput: unknown): operatorInput is [number | string, number | string] {\n  return Array.isArray(operatorInput)\n    && operatorInput.length === 2\n    && numberValidator(operatorInput[0])\n    && numberValidator(operatorInput[1])\n    && operatorInput[0] <= operatorInput[1];\n}\n\n/**\n * Verifies if the parameter is a valid date for the operator (getTime function available returning a number)\n * @param operatorInput\n */\nexport const isValidDate = (operatorInput: any): operatorInput is Date => {\n  if (!operatorInput || typeof operatorInput.getTime !== 'function') {\n    return false;\n  }\n  const getTimeResult = operatorInput.getTime();\n  return typeof getTimeResult === 'number' && !Number.isNaN(getTimeResult);\n};\n\n/**\n * Verifies if the parameter is a valid input for Date constructor (new Date returns a valid date)\n * @param operatorInput\n */\nexport const isValidDateInput = (operatorInput: any): operatorInput is DateInput => {\n  return operatorInput === 0 || (!!operatorInput && isValidDate(new Date(operatorInput)));\n};\n\n/**\n * Verifies if the parameter is a valid date range\n * @param operatorInput\n */\nexport const isValidDateRange = (operatorInput: any): operatorInput is [DateInput, DateInput] => {\n  return Array.isArray(operatorInput)\n    && operatorInput.length === 2\n    && isValidDateInput(operatorInput[0])\n    && isValidDateInput(operatorInput[1])\n    && new Date(operatorInput[0]) <= new Date(operatorInput[1]);\n};\n\n/**\n * Validate that a value is a supported simple type\n * @param value value to validate\n */\nexport function isSupportedSimpleTypes(value: unknown): value is SupportedSimpleTypes {\n  return ['string', 'boolean', 'number', 'undefined'].includes(typeof value) || value === null || isValidDate(value);\n}\n\n/**\n * Validate that a value is a string\n * @param value\n */\nexport function isString(value: unknown): value is string {\n  return typeof value === 'string';\n}\n\n/**\n * Parse input to return RegExp\n * @param inputRegExp\n */\nexport function parseRegExp(inputRegExp: string) {\n  if (inputRegExp.startsWith('/')) {\n    const finalSlash = inputRegExp.lastIndexOf('/');\n    const regexpPattern = inputRegExp.slice(1, finalSlash);\n    const regexpFlags = inputRegExp.slice(finalSlash + 1);\n    return new RegExp(regexpPattern, regexpFlags);\n  }\n  return new RegExp(inputRegExp);\n}\n","import {\n  isRangeNumber,\n  isString,\n  isSupportedSimpleTypes,\n  numberValidator,\n  parseRegExp,\n} from '../operator.helpers';\nimport {\n  Operator,\n  SupportedSimpleTypes,\n} from '../operator.interface';\n\n/**\n * Check if any of the variable's value is equal to a specific value\n * @title contains\n */\nexport const arrayContains: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n  name: 'arrayContains',\n  evaluator: (value, b) => value.includes(b),\n  validateLhs: Array.isArray,\n  validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if the specified text value is included in the text variable\n * @title contains\n */\nexport const stringContains: Operator<string, string> = {\n  name: 'stringContains',\n  evaluator: (inputString, substring) => inputString.includes(substring),\n  validateLhs: isString,\n  validateRhs: isString\n};\n\n/**\n * Check if every value of the variable is different from a specific value\n * @title does not contain\n */\nexport const notArrayContains: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n  name: 'notArrayContains',\n  evaluator: (array, value) => !array.includes(value),\n  validateLhs: Array.isArray,\n  validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if the specified text value is not included in the text variable\n * @title does not contain\n */\nexport const notStringContains: Operator<string, string> = {\n  name: 'notStringContains',\n  evaluator: (inputString, substring: any) => !inputString.includes(substring),\n  validateLhs: isString,\n  validateRhs: isString\n};\n\n/**\n * Check if every value of the variable equals a specific value\n * @title all equal to\n */\nexport const allEqual: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n  name: 'allEqual',\n  // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n  evaluator: (array, value) => array.every((elementValue) => elementValue == value),\n  validateLhs: Array.isArray,\n  validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if every numerical value of the variable is greater than a specific value\n * @title all >\n */\nexport const allGreater: Operator<SupportedSimpleTypes[], number | string> = {\n  name: 'allGreater',\n  evaluator: (array, value) => array.every((elementValue) => numberValidator(elementValue) && +elementValue > +value),\n  validateLhs: Array.isArray,\n  validateRhs: numberValidator\n};\n\n/**\n * Check if every value of the variable is in a specific list\n * @title all in\n */\nexport const allIn: Operator<SupportedSimpleTypes[], SupportedSimpleTypes[]> = {\n  name: 'allIn',\n  evaluator: (array, value) => array.every((elementValue) => value.includes(elementValue)),\n  validateLhs: Array.isArray,\n  validateRhs: Array.isArray\n};\n\n/**\n * Check if every value of the variable is not in a specific list\n * @title none in\n */\nexport const allNotIn: Operator<SupportedSimpleTypes[], SupportedSimpleTypes[]> = {\n  name: 'allNotIn',\n  evaluator: (array, value) => !array.some((elementValue) => value.includes(elementValue)),\n  validateLhs: Array.isArray,\n  validateRhs: Array.isArray\n};\n\n/**\n * Check if every numerical value of the variable is lower than a specific value\n * @title all <\n */\nexport const allLower: Operator<number[], number | string> = {\n  name: 'allLower',\n  evaluator: (arrayNumber, number) => arrayNumber.every((elementNumber) => elementNumber < +number),\n  validateLhs: Array.isArray,\n  validateRhs: numberValidator\n};\n\n/**\n * Check if every string value of the variable matches a specific pattern\n * @title all match\n */\nexport const allMatch: Operator<string[], string> = {\n  name: 'allMatch',\n  evaluator: (array, inputRegExp) => {\n    const regExp = parseRegExp(inputRegExp);\n    return array.every((elementValue) => regExp.test(elementValue));\n  },\n  validateLhs: Array.isArray,\n  validateRhs: isString\n};\n\n/**\n * Check if every value of the variable is included in a specified range\n * @title all between\n */\nexport const allRangeNumber: Operator<number[], [number | string, number | string]> = {\n  name: 'allRangeNumber',\n  evaluator: (rangeArray, [from, to]) =>\n    rangeArray.every((elementValue) => elementValue >= +from && elementValue <= +to),\n  validateLhs: Array.isArray,\n  validateRhs: isRangeNumber\n};\n\n/**\n * Check if at least one of the values of the variable equals a specific value\n * @title one equal to\n */\nexport const oneEquals: Operator<SupportedSimpleTypes[], SupportedSimpleTypes> = {\n  name: 'oneEquals',\n  // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n  evaluator: (array, value) => array.some((elementValue) => elementValue == value),\n  validateLhs: Array.isArray,\n  validateRhs: isSupportedSimpleTypes\n};\n\n/**\n * Check if one of the values of the variable is greater than a specific value\n * @title one >\n */\nexport const oneGreater: Operator<number[], number | string> = {\n  name: 'oneGreater',\n  evaluator: (arrayNumber, number) => arrayNumber.some((elementValue) => elementValue > +number),\n  validateLhs: Array.isArray,\n  validateRhs: numberValidator\n};\n\n/**\n * Check if at least one of the values of the variable is equal to one in a specified list\n * @title one in\n */\nexport const oneIn: Operator<SupportedSimpleTypes[], SupportedSimpleTypes[]> = {\n  name: 'oneIn',\n  evaluator: (firstArray, secondArray) =>\n    firstArray.some((elementValue) => secondArray.includes(elementValue)),\n  validateLhs: Array.isArray,\n  validateRhs: Array.isArray\n};\n\n/**\n * Check if one of the values of the variable is lower than a specific value\n * @title one <\n */\nexport const oneLower: Operator<number[], number | string> = {\n  name: 'oneLower',\n  evaluator: (arrayNumber, number) => arrayNumber.some((elementValue) => elementValue < +number),\n  validateLhs: Array.isArray,\n  validateRhs: numberValidator\n};\n\n/**\n * Check if one of the values of the variable matches a specific pattern\n * @title one matches\n */\nexport const oneMatches: Operator<string[], string> = {\n  name: 'oneMatches',\n  evaluator: (arrayString, inputRegExp) => {\n    const regExp = parseRegExp(inputRegExp);\n    return arrayString.some((elementValue) => regExp.test(elementValue));\n  },\n  validateLhs: Array.isArray,\n  validateRhs: isString\n};\n\n/**\n * Check if one of the values of the variable is included in a specified range\n * @title one between\n */\nexport const oneRangeNumber: Operator<number[], [number | string, number | string]> = {\n  name: 'oneRangeNumber',\n  evaluator: (arrayNumber, [from, to]) =>\n    arrayNumber.some((elementValue) => elementValue >= +from && elementValue <= +to),\n  validateLhs: Array.isArray,\n  validateRhs: isRangeNumber\n};\n\n/**\n * Check if the number of values of the variable is equal to a specific value\n * @title number of =\n */\nexport const lengthEquals: Operator<any[], number | string> = {\n  name: 'lengthEquals',\n  evaluator: (array, length) => array.length === Number(length),\n  validateLhs: Array.isArray,\n  validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is different from a specific value\n * @title number of ≠\n */\nexport const lengthNotEquals: Operator<any[], number | string> = {\n  name: 'lengthNotEquals',\n  evaluator: (array, length) => array.length !== Number(length),\n  validateLhs: Array.isArray,\n  validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is lower or equal to a specific value\n * @title number of ≤\n */\nexport const lengthLessThanOrEquals: Operator<any[], number | string> = {\n  name: 'lengthLessThanOrEquals',\n  evaluator: (array, length) => array.length <= +length,\n  validateLhs: Array.isArray,\n  validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is lower than a specific value\n * @title number of <\n */\nexport const lengthLessThan: Operator<any[], number | string> = {\n  name: 'lengthLessThan',\n  evaluator: (array, length) => array.length < +length,\n  validateLhs: Array.isArray,\n  validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is greater or equal to a specific value\n * @title number of ≥\n */\nexport const lengthGreaterThanOrEquals: Operator<any[], number | string> = {\n  name: 'lengthGreaterThanOrEquals',\n  evaluator: (array, length) => array.length >= +length,\n  validateLhs: Array.isArray,\n  validateRhs: numberValidator\n};\n\n/**\n * Check if the number of values of the variable is greater than a specific value\n * @title number of >\n */\nexport const lengthGreaterThan: Operator<any[], number | string> = {\n  name: 'lengthGreaterThan',\n  evaluator: (array, length) => array.length > +length,\n  validateLhs: Array.isArray,\n  validateRhs: numberValidator\n};\n\n/** List of all default array operators */\nexport const arrayBasedOperators = [\n  allEqual,\n  allGreater,\n  allIn,\n  allLower,\n  allMatch,\n  allNotIn,\n  allRangeNumber,\n  arrayContains,\n  lengthEquals,\n  lengthNotEquals,\n  lengthGreaterThan,\n  lengthGreaterThanOrEquals,\n  lengthLessThan,\n  lengthLessThanOrEquals,\n  notArrayContains,\n  notStringContains,\n  oneEquals,\n  oneGreater,\n  oneIn,\n  oneLower,\n  oneMatches,\n  oneRangeNumber,\n  stringContains\n];\n","import {\n  isString,\n  isSupportedSimpleTypes,\n  parseRegExp,\n} from '../operator.helpers';\nimport {\n  Operator,\n  SupportedSimpleTypes,\n  UnaryOperator,\n} from '../operator.interface';\n\n/**\n * Check if a variable is equal to a specific value\n * @title is equal to\n */\nexport const equals: Operator = {\n  name: 'equals',\n  // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n  evaluator: (firstValue, secondValue) => firstValue == secondValue\n};\n\n/**\n * Check if a variable is different from a specific value\n * @title is not equal to\n */\nexport const notEquals: Operator = {\n  name: 'notEquals',\n  // eslint-disable-next-line eqeqeq -- possibility of comparing string and number values\n  evaluator: (firstValue, secondValue) => firstValue != secondValue\n};\n\n/**\n * Check if the variable's value is included in a specified list\n * @title is in\n */\nexport const inArray: Operator<SupportedSimpleTypes, SupportedSimpleTypes[]> = {\n  name: 'inArray',\n  evaluator: (value, array) => array.includes(value),\n  validateLhs: isSupportedSimpleTypes,\n  validateRhs: Array.isArray\n};\n\n/**\n * Check if the variable's value is not included in the value list\n * @title is not in\n */\nexport const notInArray: Operator<SupportedSimpleTypes, SupportedSimpleTypes[]> = {\n  name: 'notInArray',\n  evaluator: (value, array) => !array.includes(value),\n  validateLhs: isSupportedSimpleTypes,\n  validateRhs: Array.isArray\n};\n\n/**\n * Check if the text variable is part of the specified value\n * @title within\n */\nexport const inString: Operator<string, string> = {\n  name: 'inString',\n  evaluator: (value, inputString) => inputString.includes(value),\n  validateLhs: isString,\n  validateRhs: isString\n};\n\n/**\n * Check if the text variable is not part of the specified value\n * @title not within\n */\nexport const notInString: Operator<string, string> = {\n  name: 'notInString',\n  evaluator: (value, inputString) => !inputString.includes(value),\n  validateLhs: isString,\n  validateRhs: isString\n};\n\n/**\n * Check if the variable and its value are defined\n * @title is defined\n */\nexport const isDefined: UnaryOperator<any> = {\n  name: 'isDefined',\n  evaluator: (input) => input !== undefined && input !== null\n};\n\n/**\n * Check if the variable and its value are undefined\n * @title is not defined\n */\nexport const isUndefined: UnaryOperator<any> = {\n  name: 'isUndefined',\n  evaluator: (input) => input === undefined || input === null\n};\n\n/**\n * Check if the text variable matches the specified RegExp pattern\n * @title matches the pattern\n */\nexport const matchesPattern: Operator<string, string> = {\n  name: 'matchesPattern',\n  evaluator: (value, inputRegExp) => {\n    const regExp = parseRegExp(inputRegExp);\n    return regExp.test(value);\n  },\n  validateLhs: isString,\n  validateRhs: isString\n};\n\n/** List of all default basic operators */\nexport const basicOperators = [\n  equals, inArray, inString, isDefined, isUndefined, matchesPattern, notEquals, notInArray, notInString\n];\n","import {\n  isValidDateInput,\n  isValidDateRange,\n  numberValidator,\n} from '../operator.helpers';\nimport {\n  DateInput,\n  Operator,\n} from '../operator.interface';\n\n/**\n * Check if a date variable is in a specified date range\n * @title is between\n */\nexport const inRangeDate: Operator<Date, [DateInput, DateInput], DateInput> = {\n  name: 'inRangeDate',\n  evaluator: (date, [from, to]) => {\n    const dateObject = new Date(date);\n    return new Date(from) <= dateObject && new Date(to) >= dateObject;\n  },\n  validateLhs: isValidDateInput,\n  validateRhs: isValidDateRange\n};\n\n/**\n * Check if the value of the variable is in the next x minutes\n * @title is in next minutes\n * @returns false for dates before `now` and for dates after `now` + `nextMinutes`, true for dates between `now` and `now` + `nextMinutes`\n */\nexport const dateInNextMinutes: Operator<Date, number, DateInput, string | number> = {\n  name: 'dateInNextMinutes',\n  evaluator: (leftDateInput, minutes, operatorFactValues) => {\n    if (!operatorFactValues) {\n      throw new Error('No operatorFactValues. Unable to retrieve the current time.');\n    }\n    if (typeof operatorFactValues.o3rCurrentTime !== 'number') {\n      throw new Error('o3rCurrentTime value is not a number');\n    }\n    const currentTimeValue = operatorFactValues.o3rCurrentTime;\n    return inRangeDate.evaluator(leftDateInput, [currentTimeValue, currentTimeValue + +minutes * 60_000]);\n  },\n  factImplicitDependencies: ['o3rCurrentTime'],\n  validateLhs: isValidDateInput,\n  validateRhs: numberValidator\n};\n\n/**\n * Check if the value of the variable is not in the next x minutes\n * @title is not in next minutes\n * @returns false for dates before `now` and for dates between `now` and `now` + `nextMinutes`, true for dates after `now` + `nextMinutes`\n */\nexport const dateNotInNextMinutes: Operator<Date, number, DateInput, string | number> = {\n  name: 'dateNotInNextMinutes',\n  evaluator: (leftDateInput, minutes, operatorFactValues) => {\n    if (!operatorFactValues) {\n      throw new Error('No operatorFactValues. Unable to retrieve the current time.');\n    }\n    if (typeof operatorFactValues.o3rCurrentTime !== 'number') {\n      throw new Error('o3rCurrentTime value is not a number');\n    }\n    const currentTimeValue = operatorFactValues.o3rCurrentTime;\n    const now = new Date(currentTimeValue);\n    const leftDate = new Date(leftDateInput);\n    const targetDate = new Date(new Date(currentTimeValue).setMinutes(now.getMinutes() + +minutes));\n    return leftDate >= now && leftDate > targetDate;\n  },\n  factImplicitDependencies: ['o3rCurrentTime'],\n  validateLhs: isValidDateInput,\n  validateRhs: numberValidator\n};\n\n/**\n * Check if a date variable is prior than a specified date\n * @title is before\n */\nexport const dateBefore: Operator<Date, DateInput, DateInput> = {\n  name: 'dateBefore',\n  evaluator: (leftDate, rightDate) => {\n    const firstDateTime = new Date(leftDate).setHours(0, 0, 0, 0);\n    const secondDateTime = new Date(rightDate).setHours(0, 0, 0, 0);\n    return firstDateTime < secondDateTime;\n  },\n  validateLhs: isValidDateInput,\n  validateRhs: isValidDateInput\n};\n\n/**\n * Check if a date variable is posterior than a specified date\n * @title is after\n */\nexport const dateAfter: Operator<Date, DateInput, DateInput> = {\n  name: 'dateAfter',\n  evaluator: (leftDate, rightDate) => {\n    const firstDateTime = new Date(leftDate).setHours(0, 0, 0, 0);\n    const secondDateTime = new Date(rightDate).setHours(0, 0, 0, 0);\n    return firstDateTime > secondDateTime;\n  },\n  validateLhs: isValidDateInput,\n  validateRhs: isValidDateInput\n};\n\n/**\n * Check if a date variable is the same as a specified date\n * @title is equal to\n */\nexport const dateEquals: Operator<Date, DateInput, DateInput> = {\n  name: 'dateEquals',\n  evaluator: (leftDate, rightDate) => {\n    const firstDateIgnoringHours = new Date(leftDate).setHours(0, 0, 0, 0);\n    const secondDateIgnoringHours = new Date(rightDate).setHours(0, 0, 0, 0);\n    return firstDateIgnoringHours === secondDateIgnoringHours;\n  },\n  validateLhs: isValidDateInput,\n  validateRhs: isValidDateInput\n};\n\n/**\n * Check if a date variable is different from a specified date\n * @title is not equal\n */\nexport const dateNotEquals: Operator<Date, DateInput, DateInput> = {\n  name: 'dateNotEquals',\n  evaluator: (leftDate, rightDate) => {\n    const firstDateIgnoringHours = new Date(leftDate).setHours(0, 0, 0, 0);\n    const secondDateIgnoringHours = new Date(rightDate).setHours(0, 0, 0, 0);\n    return firstDateIgnoringHours !== secondDateIgnoringHours;\n  },\n  validateLhs: isValidDateInput,\n  validateRhs: isValidDateInput\n};\n\nexport const dateBasedOperators = [\n  inRangeDate, dateInNextMinutes, dateNotInNextMinutes, dateAfter, dateBefore, dateEquals, dateNotEquals\n];\n","import {\n  numberValidator,\n} from '../operator.helpers';\nimport {\n  Operator,\n} from '../operator.interface';\n\n/**\n * Check if the number variable is greater or equal to a specific value\n * @title ≥\n */\nexport const greaterThanOrEqual: Operator<number, number, number | string, number | string> = {\n  name: 'greaterThanOrEqual',\n  evaluator: (firstNumber, secondNumber) => firstNumber >= secondNumber,\n  validateLhs: numberValidator,\n  validateRhs: numberValidator\n};\n\n/**\n * Check if the number variable is greater than a specific value\n * @title >\n */\nexport const greaterThan: Operator<number, number, number | string, number | string> = {\n  name: 'greaterThan',\n  evaluator: (firstNumber, secondNumber) => firstNumber > secondNumber,\n  validateLhs: numberValidator,\n  validateRhs: numberValidator\n};\n\n/**\n * Check if the number variable is lower or equal to a specific value\n * @title ≤\n */\nexport const lessOrEqual: Operator<number, number, number | string, number | string> = {\n  name: 'lessOrEqual',\n  evaluator: (firstNumber, secondNumber) => firstNumber <= secondNumber,\n  validateLhs: numberValidator,\n  validateRhs: numberValidator\n};\n\n/**\n * Check if the number variable is lower than a specific value\n * @title <\n */\nexport const lessThan: Operator<number, number, number | string, number | string> = {\n  name: 'lessThan',\n  evaluator: (firstNumber, secondNumber) => firstNumber < secondNumber,\n  validateLhs: numberValidator,\n  validateRhs: numberValidator\n};\n\n/** List of all default number based operators */\nexport const numberBasedOperators = [greaterThan, greaterThanOrEqual, lessThan, lessOrEqual];\n","import {\n  arrayBasedOperators,\n} from './array-based.operators';\nimport {\n  basicOperators,\n} from './basic.operators';\nimport {\n  dateBasedOperators,\n} from './date-based.operators';\nimport {\n  numberBasedOperators,\n} from './number-based.operators';\n\nexport * from './array-based.operators';\nexport * from './basic.operators';\nexport * from './date-based.operators';\nexport * from './number-based.operators';\n\nexport const operatorList = [...arrayBasedOperators, ...basicOperators, ...numberBasedOperators, ...dateBasedOperators];\n","import {\n  AllConditions,\n  AnyConditions,\n  BinaryOperation,\n  NotCondition,\n  Operand,\n  OperandFact,\n  UnaryOperation,\n} from '../structure';\n\n/**\n * Determine if the condition is a properties condition\n * @param condition Condition to analyze\n */\nexport function isConditionProperties(condition: any): condition is BinaryOperation | UnaryOperation {\n  return condition && typeof condition.operator !== 'undefined' && typeof condition.lhs !== 'undefined';\n}\n\n/**\n * Determine if the given operand is a Fact operand\n * @param operand Operand to analyze\n */\nexport function isOperandFact(operand: any): operand is OperandFact {\n  return operand && operand.type === 'FACT';\n}\n\n/**\n * Determine if the given operand is a Inner Fact operand\n * @param operand Operand to analyze\n */\nexport function isOperandRuntimeFact(operand: any): operand is Operand<'RUNTIME_FACT', string> {\n  return operand && operand.type === 'RUNTIME_FACT';\n}\n\n/**\n * Determine if the given operand is a Static Value operand\n * @param operand Operand to analyze\n */\nexport function isOperandLiteral(operand: any): operand is Operand<'LITERAL'> {\n  return operand && operand.type === 'LITERAL';\n}\n\n/**\n * Determine if the given condition is All based child conditions\n * @param condition Condition node\n */\nexport function isAllConditions(condition: any): condition is AllConditions {\n  return condition && typeof condition.all !== 'undefined';\n}\n\n/**\n * Determine if the given condition is Any based child conditions\n * @param condition Condition node\n */\nexport function isAnyConditions(condition: any): condition is AnyConditions {\n  return condition && typeof condition.any !== 'undefined';\n}\n\n/**\n * Determine if the given condition is Not based child conditions\n * @param condition Condition node\n */\nexport function isNotCondition(condition: any): condition is NotCondition {\n  return condition && typeof condition.not !== 'undefined';\n}\n","/** Ruleset executor */\nimport {\n  JSONPath,\n} from 'jsonpath-plus';\nimport {\n  combineLatest,\n  Observable,\n  of,\n} from 'rxjs';\nimport {\n  distinctUntilChanged,\n  map,\n  pairwise,\n  shareReplay,\n  startWith,\n  switchMap,\n  tap,\n} from 'rxjs/operators';\nimport {\n  handleRuleEvaluationDebug,\n} from './debug/helpers';\nimport type {\n  RulesEngine,\n} from './engine';\nimport {\n  EngineRuleset,\n  EvaluationReason,\n  RuleEvaluation,\n  RuleEvaluationOutput,\n} from './engine.interface';\nimport type {\n  Facts,\n} from './fact';\nimport {\n  executeOperator,\n} from './operator/operator.helpers';\nimport {\n  Operator,\n} from './operator/operator.interface';\nimport {\n  isAllConditions,\n  isConditionProperties,\n  isNotCondition,\n  isOperandFact,\n  isOperandLiteral,\n  isOperandRuntimeFact,\n} from './rule/rule.helpers';\nimport {\n  ActionBlock,\n  ActionSetTemporaryFactBlock,\n  AllBlock,\n  GenericOperand,\n  IfElseBlock,\n  NestedCondition,\n  Rule,\n  Ruleset,\n} from './structure';\n\n/** Type of the retrieve fact function */\nexport type RetrieveFactFuncType = <T = unknown> (id: string) => Observable<T | undefined>;\n\nexport class RulesetExecutor {\n  /** retrieveFactFunc */\n  protected readonly rulesEngine: RulesEngine;\n\n  /** Map of available operators */\n  protected readonly operators: Record<string, Operator<unknown, unknown>>;\n\n  /** Delay before fact stream defaulting value */\n  public readonly factDefaultDelay?: number;\n\n  /** Ruleset associated to the current executor*/\n  public readonly ruleset: Ruleset;\n\n  /** Ruleset plugged to the fact stream, that contains actions stream result */\n  public readonly engineRuleset: EngineRuleset;\n\n  private executionCounter = 0;\n\n  /**\n   * Create a new ruleset executor\n   * @param ruleset Ruleset to evaluate\n   * @param rulesEngine Instance of the rules engine\n   */\n  constructor(ruleset: Ruleset, rulesEngine: RulesEngine) {\n    this.ruleset = ruleset;\n    this.rulesEngine = rulesEngine;\n    this.operators = rulesEngine.operators;\n    this.engineRuleset = this.plugRuleset();\n  }\n\n  /**\n   * Recursively explores a rule to identify and collect input facts.\n   * Input facts are identified based on the 'FACT' type and operator-specific implicit dependencies.\n   * @param currentObject The current object being explored.\n   * @param ruleInputFacts A set to store the identified input facts for the rule.\n   */\n  private collectRuleInputFacts(currentObject: AllBlock | NestedCondition | NestedCondition[], ruleInputFacts: Set<string>) {\n    if (currentObject && isOperandFact(currentObject)) {\n      ruleInputFacts.add(currentObject.value);\n    } else if (Array.isArray(currentObject)) {\n      currentObject.forEach((elem) => this.collectRuleInputFacts(elem, ruleInputFacts));\n    } else {\n      for (const key in currentObject) {\n        if ((key === 'operator') && isConditionProperties(currentObject)) {\n          const op = this.operators[currentObject[key]];\n          if (op && op.factImplicitDependencies) {\n            op.factImplicitDependencies.forEach((dep) => ruleInputFacts.add(dep));\n          }\n        } else if (typeof currentObject[key as keyof (AllBlock | NestedCondition)] === 'object') {\n          this.collectRuleInputFacts(currentObject[key as keyof (AllBlock | NestedCondition)], ruleInputFacts);\n        }\n      }\n    }\n  }\n\n  /**\n   * Report performance mark for a rule run\n   * @param rule Rule to measure\n   * @param status status of the rule evaluation\n   */\n  protected performanceMark(rule: Rule, status: 'start' | 'end') {\n    if (this.rulesEngine.performance) {\n      const markName = `rules-engine:${this.rulesEngine.rulesEngineInstanceName}:${this.ruleset.name}:${rule.name}`;\n      this.rulesEngine.performance.mark(`${markName}:${status}`);\n      if (status === 'end') {\n        this.rulesEngine.performance.measure(markName, `${markName}:start`, `${markName}:end`);\n      }\n    }\n  }\n\n  /**\n   * Get operand value stream according to its type\n   * @param operand operand of the condition\n   * @param factsValue\n   * @param runtimeFactValues\n   */\n  protected getOperandValue(operand: GenericOperand | undefined, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>): unknown {\n    if (typeof operand === 'undefined') {\n      return undefined;\n    } else if (isOperandFact(operand)) {\n      const factValue = factsValue[operand.value];\n      // eslint-disable-next-line new-cap -- convention for JSONPath\n      return operand.path ? factValue && JSONPath({ wrap: false, json: factValue, path: operand.path }) : factValue;\n    } else if (isOperandLiteral(operand)) {\n      return operand.value;\n    } else if (isOperandRuntimeFact(operand)) {\n      return runtimeFactValues[operand.value];\n    }\n    return undefined;\n  }\n\n  /**\n   * Process a root rule from a ruleset, and return the associated actions to be processed\n   * Will also update the runtimeFactValues map that is ruleset wise\n   * Note that runtimeFactValues will be mutated by all the runtime facts actions executed\n   * @param rule\n   * @param factsValue\n   * @param runtimeFactValues\n   * @protected\n   */\n  protected evaluateRule(rule: Rule, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>) {\n    return this.evaluateBlock(rule.rootElement, factsValue, runtimeFactValues);\n  }\n\n  /**\n   * Recursively process a block to extract all the actions keeping the order\n   * Note that runtimeFactValues will be mutated by all the runtime facts actions executed\n   * @param element\n   * @param factsValue\n   * @param runtimeFactValues This runtime fact map will be mutated by all the runtime facts actions executed\n   * @param actions\n   * @protected\n   */\n  protected evaluateBlock(element: AllBlock, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>, actions: ActionBlock[] = []) {\n    if (this.isIfElseBlock(element)) {\n      (!element.condition || this.evaluateCondition(element.condition, factsValue, runtimeFactValues) ? element.successElements : element.failureElements)\n        .forEach((elementResult) => this.evaluateBlock(elementResult, factsValue, runtimeFactValues, actions));\n    } else if (this.isActionBlock(element)) {\n      if (this.isActionSetTemporaryFactBlock(element)) {\n        runtimeFactValues[element.fact] = element.value;\n      } else {\n        actions.push(element);\n      }\n    }\n    return actions;\n  }\n\n  /**\n   * Returns true if the element is a IfElse block\n   * @param element\n   * @protected\n   */\n  protected isIfElseBlock(element: AllBlock): element is IfElseBlock {\n    return element.blockType === 'IF_ELSE';\n  }\n\n  /**\n   * Returns true if the element is an action block\n   * @param element\n   * @protected\n   */\n  protected isActionBlock(element: AllBlock): element is ActionBlock {\n    return 'elementType' in element && element.elementType === 'ACTION';\n  }\n\n  /**\n   * Returns true if the action sets a temporary fact\n   * @param element\n   * @protected\n   */\n  protected isActionSetTemporaryFactBlock(element: ActionBlock): element is ActionSetTemporaryFactBlock {\n    return 'actionType' in element && element.actionType === 'SET_FACT';\n  }\n\n  /**\n   * Evaluate a condition block\n   * @param nestedCondition\n   * @param factsValue\n   * @param runtimeFactValues\n   * @protected\n   */\n  protected evaluateCondition(nestedCondition: NestedCondition, factsValue: Record<string, Facts | undefined>, runtimeFactValues: Record<string, Facts>): boolean {\n    if (isConditionProperties(nestedCondition)) {\n      const operator = this.operators[nestedCondition.operator];\n      if (operator === undefined) {\n        throw new Error(`Unknown operator : ${nestedCondition.operator}, skipping the rule execution...`);\n      }\n      return executeOperator(this.getOperandValue(nestedCondition.lhs, factsValue, runtimeFactValues),\n        this.getOperandValue('rhs' in nestedCondition ? nestedCondition.rhs : undefined, factsValue, runtimeFactValues), operator, factsValue);\n    }\n\n    if (isNotCondition(nestedCondition)) {\n      return !this.evaluateCondition(nestedCondition.not, factsValue, runtimeFactValues);\n    }\n    if (nestedCondition.all || nestedCondition.any) {\n      const evaluate = (condition: NestedCondition) => this.evaluateCondition(condition, factsValue, runtimeFactValues);\n      return isAllConditions(nestedCondition) ? nestedCondition.all.every((element) => evaluate(element)) : nestedCondition.any.some((element) => evaluate(element));\n    }\n    throw new Error(`Unknown condition block met : ${JSON.stringify(nestedCondition)}`);\n  }\n\n  /**\n   * Find rule input facts\n   * @param obj\n   */\n  protected readonly findRuleInputFacts = (obj: AllBlock): string[] => {\n    const ruleInputFacts = new Set<string>();\n    this.collectRuleInputFacts(obj, ruleInputFacts);\n    return Array.from(ruleInputFacts);\n  };\n\n  /**\n   * Plug ruleset to fact streams and trigger a first evaluation\n   */\n  protected plugRuleset() {\n    const inputFactsForRule: Record<string, string[]> = {};\n    this.ruleset.rules.forEach((rule) => inputFactsForRule[rule.id] = this.findRuleInputFacts(rule.rootElement));\n    const factsThatRerunEverything: string[] = [];\n    this.ruleset.rules.forEach((rule) => {\n      if (rule.outputRuntimeFacts.length > 0 || rule.inputRuntimeFacts.length > 0) {\n        factsThatRerunEverything.push(...inputFactsForRule[rule.id]);\n      } else {}\n    });\n    const triggerFull$: Observable<unknown[]> = factsThatRerunEverything.length === 0\n      ? of([])\n      : combineLatest(factsThatRerunEverything.map((fact) => this.rulesEngine.retrieveOrCreateFactStream(fact)));\n    const result$ = triggerFull$.pipe(switchMap(() => {\n      const runtimeFactValues: Record<string, Facts> = {};\n\n      let rulesetInputFacts: string[];\n      if (this.rulesEngine.debugMode) {\n        rulesetInputFacts = Array.from(this.ruleset.rules.reduce((acc, rule) => {\n          inputFactsForRule[rule.id].forEach((factName) => acc.add(factName));\n          return acc;\n        }, new Set<string>()));\n      }\n\n      return combineLatest(this.ruleset.rules.map((rule) => {\n        const inputFacts = inputFactsForRule[rule.id];\n        const values$ = inputFacts.map((fact) => this.rulesEngine.retrieveOrCreateFactStream(fact));\n        return (values$.length > 0 ? combineLatest(values$) : of([[]] as (Facts | undefined)[]))\n          .pipe(\n            startWith(undefined),\n            pairwise(),\n            tap(() => this.performanceMark(rule, 'start')),\n            map(([oldFactValues, factValues]) => {\n              const output: RuleEvaluationOutput = { actions: undefined };\n\n              try {\n                output.actions = this.evaluateRule(rule, inputFacts.reduce<Record<string, Facts | undefined>>((acc, id, index) => {\n                  acc[id] = factValues![index];\n                  return acc;\n                }, {}), runtimeFactValues);\n              } catch (error) {\n                output.actions = undefined;\n                output.error = error;\n              }\n\n              if (this.rulesEngine.debugMode) {\n                output.evaluation = handleRuleEvaluationDebug(rule, this.ruleset.name, output.actions, output.error, runtimeFactValues, factValues, oldFactValues, inputFacts);\n              } else if (output.error) {\n                this.rulesEngine.logger?.error(`Error while evaluating rule ID: ${rule.id}`, output.error);\n                this.rulesEngine.logger?.warn(`Skipping rule ${rule.name}, and the associated ruleset`);\n              }\n              return output;\n            }),\n            tap(() => this.performanceMark(rule, 'end'))\n          );\n      })).pipe(\n        startWith(undefined),\n        pairwise(),\n        map(([prevRes, currRes]) => {\n          const actionsLists = currRes!.map((r) => r.actions);\n          const allExecutionsValid = actionsLists.every((actions) => !!actions);\n\n          let execInfo: {\n            executionCounter?: number;\n            actionsLists: ActionBlock[][];\n            rulesetOutputExecution?: RuleEvaluation[];\n            allExecutionsValid?: boolean;\n            rulesetTriggers?: Record<string, Record<string, EvaluationReason>>;\n          } = { actionsLists: (allExecutionsValid ? actionsLists : [[]]) };\n\n          if (this.rulesEngine.engineDebug) {\n            execInfo = {\n              ...execInfo,\n              ...this.rulesEngine.engineDebug.handleDebugRulesetExecutionInfo(\n                currRes!, prevRes, allExecutionsValid, rulesetInputFacts, runtimeFactValues, ++this.executionCounter, this.ruleset)\n            };\n          }\n          return execInfo;\n        }),\n        map((output) => {\n          const outputActions = ([] as ActionBlock[]).concat(...output.actionsLists);\n\n          if (this.rulesEngine.engineDebug && output.allExecutionsValid) {\n            this.rulesEngine.engineDebug.addRulesetExecutionEvent(this.ruleset, output.executionCounter!,\n              rulesetInputFacts, outputActions, runtimeFactValues, output.rulesetTriggers!,\n              output.rulesetOutputExecution!);\n          }\n\n          return outputActions;\n        }),\n        distinctUntilChanged((prev, curr) => prev.length === 0 && curr.length === 0)\n      );\n    }), shareReplay({ bufferSize: 1, refCount: true }));\n\n    return {\n      id: this.ruleset.id,\n      validityRange: this.ruleset.validityRange,\n      linkedComponents: this.ruleset.linkedComponents,\n      rulesResultsSubject$: result$\n    } as EngineRuleset;\n  }\n}\n","import type {\n  Logger,\n} from '@o3r/logger';\nimport {\n  BehaviorSubject,\n  firstValueFrom,\n  merge,\n  Observable,\n  of,\n} from 'rxjs';\nimport {\n  delay,\n  distinctUntilChanged,\n  shareReplay,\n  switchMap,\n  takeUntil,\n  tap,\n} from 'rxjs/operators';\nimport {\n  EngineDebugger,\n} from './debug/engine.debug';\nimport {\n  FactObject,\n  RulesEngineOptions,\n} from './engine.interface';\nimport type {\n  Fact,\n  Facts,\n} from './fact/index';\nimport {\n  filterRulesetsEventStream,\n} from './helpers/filter-ruleset-event.operator';\nimport {\n  Operator,\n  operatorList,\n  UnaryOperator,\n} from './operator/index';\nimport {\n  RulesetExecutor,\n} from './ruleset-executor';\nimport {\n  ActionBlock,\n  Ruleset,\n} from './structure';\n\n/** Rules engine */\nexport class RulesEngine {\n  /** Map of registered fact stream, this map is mutated by the ruleset executors */\n  private readonly factMap: Record<string, FactObject<any>> = {};\n\n  /** Subject containing the rulesets and the results stream*/\n  private readonly rulesetMapSubject = new BehaviorSubject<Record<string, RulesetExecutor>>({});\n\n  /** Map of available operators */\n  public operators: Record<string, Operator<unknown, unknown>>;\n\n  /** List of events for the current state of the rules engine */\n  public readonly events$: Observable<ActionBlock[]>;\n\n  /** Delay before fact stream defaulting value */\n  public factDefaultDelay?: number;\n\n  /**\n   * Instance of engine debug object; Undefined if debugMode is not active\n   */\n  public readonly engineDebug?: EngineDebugger;\n\n  /** Name of the rules engine instance */\n  public readonly rulesEngineInstanceName: string;\n\n  /**\n   * Performance reporter to use for performance measurements.\n   * @default window.performance on browser only, undefined on node\n   */\n  public readonly performance;\n\n  /**\n   * Log the engine errors\n   */\n  public readonly logger?: Logger;\n  /**\n   * Flag to check if the run is in debug mode or not\n   */\n  public get debugMode(): boolean {\n    return !!this.engineDebug;\n  }\n\n  /**\n   * Rules engine\n   * @param options rules engine options\n   */\n  constructor(options?: RulesEngineOptions) {\n    this.performance = options?.performance || (typeof window === 'undefined' ? undefined : window.performance);\n    this.engineDebug = options?.debugger;\n    this.engineDebug?.registerRuleEngine(this);\n    this.logger = options?.logger;\n    this.rulesEngineInstanceName = options?.rulesEngineInstanceName || 'RulesEngine';\n    this.factDefaultDelay = options?.factDefaultDelay;\n    // Load default operators\n    this.operators = operatorList.reduce<Record<string, Operator<any, any>>>((acc, operator) => {\n      acc[operator.name] = operator;\n      return acc;\n    }, {});\n    this.events$ = this.rulesetMapSubject.pipe(\n      this.prepareActionsStream(),\n      this.handleActionsStreamOutput()\n    );\n    if (options?.facts) {\n      this.upsertFacts(options.facts);\n    }\n    if (options?.rules) {\n      this.upsertRulesets(options.rules);\n    }\n    if (options?.operators) {\n      this.upsertOperators(options.operators);\n    }\n  }\n\n  /**\n   * Attach debug events to actions stream if debug engine is activated\n   */\n  private handleActionsStreamOutput<T extends ActionBlock = ActionBlock>(): (actionsStream$: Observable<T[]>) => Observable<T[]> {\n    return (actionsStream$: Observable<T[]>) => this.engineDebug ? actionsStream$.pipe(tap((allActions) => this.engineDebug!.allActionsChange(allActions))) : actionsStream$;\n  }\n\n  /**\n   * Create the actions stream event based on provided active rulesets ids; Handle debug too\n   * @param ruleSets\n   */\n  private prepareActionsStream<T extends ActionBlock = ActionBlock>(ruleSets?: string[]): (rulesetMapSubject$: Observable<Record<string, RulesetExecutor>>) => Observable<T[]> {\n    return (rulesetMapSubject$: Observable<Record<string, RulesetExecutor>>) => (this.engineDebug\n      ? rulesetMapSubject$.pipe(\n        tap((ruleSetExecutorMap) => this.engineDebug!.activeRulesetsChange(ruleSetExecutorMap, ruleSets)),\n        filterRulesetsEventStream(ruleSets))\n      : rulesetMapSubject$.pipe(filterRulesetsEventStream(ruleSets))) as Observable<T[]>;\n  }\n\n  /**\n   * Create or retrieve a fact stream\n   * The fact stream created will be registered in the engine\n   * @param id ID of the fact to retrieve\n   * @param factValue$ Value stream for the fact\n   */\n  public retrieveOrCreateFactStream<T = Facts>(id: string, factValue$?: Observable<T>): Observable<T | undefined> {\n    // trick to emit undefined if the observable is not immediately emitting (to not bloc execution)\n    const obs$ = factValue$\n      ? merge(factValue$, of(undefined).pipe(delay(this.factDefaultDelay || 0), takeUntil(factValue$)))\n      : factValue$;\n    const factObj = this.factMap[id];\n    if (factObj) {\n      if (factValue$) {\n        factObj.subject.next(obs$);\n      }\n      return factObj.value$;\n    }\n\n    const subject = new BehaviorSubject<Observable<T | undefined> | undefined>(obs$);\n    const value$ = subject.pipe(\n      switchMap((value) => value || of(undefined)),\n      distinctUntilChanged(),\n      shareReplay(1)\n    );\n\n    this.factMap[id] = {\n      subject,\n      value$\n    };\n\n    return value$;\n  }\n\n  /**\n   * Retrieve the promise of the latest value of a fact.\n   * Return undefined if the fact is not defined.\n   * @param id ID of the fact to retrieve\n   */\n  public retrieveFactValue<T = unknown>(id: string): Promise<T | undefined> | undefined {\n    return this.factMap[id].value$ && firstValueFrom(this.retrieveOrCreateFactStream<T>(id), { defaultValue: undefined });\n  }\n\n  /**\n   * Update or insert fact in rules engine\n   * @param facts fact list to add / update\n   */\n  public upsertFacts<T = unknown>(facts: Fact<T> | Fact<T>[]) {\n    (Array.isArray(facts) ? facts : [facts]).forEach(({ id, value$ }) => {\n      this.engineDebug?.addAvailableFactsSnapshotEvent(id, value$);\n      this.retrieveOrCreateFactStream(id, value$);\n    });\n  }\n\n  /**\n   * Update or insert rule in rules engine\n   * @param rulesets\n   */\n  public upsertRulesets(rulesets: Ruleset[]) {\n    this.engineDebug?.addAvailableRulesets(rulesets);\n\n    this.rulesetMapSubject.next(\n      rulesets.reduce((accRuleset, ruleset) => {\n        accRuleset[ruleset.id] = new RulesetExecutor(ruleset, this);\n        return accRuleset;\n      }, { ...this.rulesetMapSubject.value })\n    );\n  }\n\n  /**\n   * Update or insert operator in rules engine\n   * @param operators operator list to add / update\n   */\n  public upsertOperators(operators: (Operator<any, any> | UnaryOperator<any>)[]) {\n    this.operators = operators.reduce((acc, operator) => {\n      acc[operator.name] = operator;\n      return acc;\n    }, { ...this.operators });\n  }\n\n  /**\n   * Operator to apply on a stream of rulesets ids\n   * Returns a stream of actions outputted by the rules engine, corresponding to the rulesetsIds\n   */\n  public getEventStream<T extends ActionBlock = ActionBlock>(): (rulesetsIds$: Observable<string[] | undefined>) => Observable<T[]> {\n    return (rulesetsIds$: Observable<string[] | undefined>) =>\n      rulesetsIds$.pipe(\n        switchMap((ruleSets) => this.rulesetMapSubject.pipe(this.prepareActionsStream<T>(ruleSets))),\n        this.handleActionsStreamOutput()\n      );\n  }\n\n  /** Get the list of registered facts names */\n  public getRegisteredFactsNames() {\n    return Object.keys(this.factMap);\n  }\n}\n","import {\n  Inject,\n  Injectable,\n  Optional,\n} from '@angular/core';\nimport {\n  takeUntilDestroyed,\n} from '@angular/core/rxjs-interop';\nimport {\n  select,\n  Store,\n} from '@ngrx/store';\nimport type {\n  RulesEngineActionHandler,\n} from '@o3r/core';\nimport {\n  LoggerService,\n} from '@o3r/logger';\nimport {\n  BehaviorSubject,\n  combineLatest,\n  Observable,\n} from 'rxjs';\nimport {\n  filter,\n  map,\n  shareReplay,\n  switchMap,\n} from 'rxjs/operators';\nimport type {\n  ActionBlock,\n  Fact,\n  Operator,\n  Ruleset,\n  UnaryOperator,\n} from '../../engine/index';\nimport {\n  EngineDebugger,\n  operatorList,\n  RulesEngine,\n} from '../../engine/index';\nimport type {\n  RulesetsStore,\n} from '../../stores';\nimport {\n  selectActiveRuleSets,\n  selectAllRulesets,\n  selectComponentsLinkedToRuleset,\n  setRulesetsEntities,\n} from '../../stores';\nimport {\n  RULES_ENGINE_OPTIONS,\n  RulesEngineServiceOptions,\n} from '../rules-engine.token';\n\n@Injectable()\nexport class RulesEngineRunnerService {\n  /** Rulesets to restrict the execution of the engine */\n  protected ruleSets$: Observable<string[] | undefined>;\n\n  /** Observable of component linked to the component */\n  protected linkedComponents$: BehaviorSubject<{ [key: string]: number }> = new BehaviorSubject({});\n\n  /** Map of engines dedicated to each rule sets */\n  public readonly engine: RulesEngine;\n\n  /** stream of the whole ruleset results */\n  public events$: Observable<ActionBlock[]>;\n\n  /** Enable action execution on new state change */\n  public enabled: boolean;\n\n  /**\n   * List of action handlers\n   * @deprecated will become protected in Otter v13, instead use {@link registerActionHandlers}\n   */\n  public readonly actionHandlers = new Set<RulesEngineActionHandler>();\n\n  constructor(\n    private readonly store: Store<RulesetsStore>,\n    private readonly logger: LoggerService,\n    @Optional() @Inject(RULES_ENGINE_OPTIONS) engineConfig?: RulesEngineServiceOptions) {\n    this.enabled = !engineConfig?.dryRun;\n    this.engine = new RulesEngine({\n      debugger: engineConfig?.debug ? new EngineDebugger({ eventsStackLimit: engineConfig?.debugEventsStackLimit }) : undefined,\n      logger: this.logger\n    });\n    this.ruleSets$ = combineLatest([\n      this.store.pipe(select(selectActiveRuleSets)),\n      this.linkedComponents$.pipe(\n        switchMap((linkedComponentsNamesMap) => this.store.pipe(\n          select(selectComponentsLinkedToRuleset),\n          map((rulesetsWithLinkedComponentsMap) =>\n            Object.keys(rulesetsWithLinkedComponentsMap.or).filter((rulesetId) =>\n              rulesetsWithLinkedComponentsMap.or[rulesetId].some((componentId) => linkedComponentsNamesMap[componentId] > 0)\n            )\n          )\n        ))\n      )\n    ]).pipe(\n      map(([activeRulesets, linkedComponentsRulesetsIds]) => ([...activeRulesets, ...linkedComponentsRulesetsIds]))\n    );\n\n    this.events$ = this.ruleSets$.pipe(\n      this.engine.getEventStream<ActionBlock>(),\n      shareReplay(1)\n    );\n\n    this.upsertOperators(operatorList);\n\n    this.store.pipe(\n      select(selectAllRulesets),\n      takeUntilDestroyed()\n    ).subscribe((rulesets: Ruleset[]) => this.engine.upsertRulesets(rulesets));\n    this.events$.pipe(takeUntilDestroyed(), filter(() => this.enabled)).subscribe((events) => {\n      void this.executeActions(events);\n    });\n  }\n\n  /**\n   * Execute the list of actions\n   * @param actions\n   */\n  protected async executeActions(actions: ActionBlock[]) {\n    const actionHandlers = [...this.actionHandlers];\n\n    const supportedActions = new Set(actionHandlers.flatMap((handler) => handler.supportingActions));\n\n    const actionMaps = actions\n      .filter((action) => {\n        const isKnown = supportedActions.has(action.actionType);\n        if (!isKnown) {\n          this.logger.warn(`The action ${action.actionType} does not have registered handler`);\n        }\n        return isKnown;\n      })\n      .reduce((acc, action) => {\n        acc[action.actionType] ||= [];\n        acc[action.actionType].push(action);\n        return acc;\n      }, {} as Record<string, ActionBlock[]>);\n\n    const handling = actionHandlers\n      .map((handler) =>\n        handler.executeActions(\n          handler.supportingActions\n            .filter((supportedAction) => actionMaps[supportedAction])\n            .reduce<ActionBlock[]>((acc, supportedAction) => acc.concat(actionMaps[supportedAction]), [])\n        )\n      );\n\n    await Promise.all(handling);\n  }\n\n  /**\n   * Update or insert fact in the rules engine\n   * @param facts fact list to add / update\n   */\n  public upsertFacts(facts: Fact<unknown> | Fact<unknown>[]) {\n    this.engine.upsertFacts(facts);\n  }\n\n  /**\n   * Update or insert operator in the rules engine\n   * @param operators operator list to add / update\n   */\n  public upsertOperators(operators: (Operator<any, any> | UnaryOperator<any>)[]) {\n    this.engine.upsertOperators(operators);\n  }\n\n  /**\n   * Upsert a list of RuleSets to be run in the rules engine\n   * @param ruleSets\n   */\n  public upsertRulesets(ruleSets: Ruleset[]) {\n    this.store.dispatch(setRulesetsEntities({ entities: ruleSets }));\n  }\n\n  /**\n   * Add action handlers in the rules engine\n   * @param actionHandlers\n   */\n  public registerActionHandlers(...actionHandlers: RulesEngineActionHandler[]) {\n    actionHandlers.forEach((actionHandler) => this.actionHandlers.add(actionHandler));\n  }\n\n  /**\n   * Remove action handlers in the rules engine\n   * @param actionHandlers\n   */\n  public unregisterActionHandlers(...actionHandlers: RulesEngineActionHandler[]) {\n    actionHandlers.forEach((actionHandler) => this.actionHandlers.delete(actionHandler));\n  }\n\n  /**\n   * Enable temporary a rule set\n   * @param componentComputedName Name of the component to enable the ruleset for\n   */\n  public enableRuleSetFor(componentComputedName: string) {\n    const newMap = this.linkedComponents$.value;\n    newMap[componentComputedName] = newMap[componentComputedName] ? newMap[componentComputedName] + 1 : 1;\n    this.linkedComponents$.next(newMap);\n  }\n\n  /**\n   * Disable temporary a rule set\n   * @param componentComputedName Name of the component to disable the ruleset for\n   */\n  public disableRuleSetFor(componentComputedName: string) {\n    const newMap = this.linkedComponents$.value;\n    if (newMap[componentComputedName] > 0) {\n      newMap[componentComputedName]--;\n      this.linkedComponents$.next(newMap);\n    }\n  }\n}\n","import {\n  ModuleWithProviders,\n  NgModule,\n} from '@angular/core';\nimport {\n  StoreModule,\n} from '@ngrx/store';\nimport {\n  LoggerModule,\n} from '@o3r/logger';\nimport {\n  RulesetsStoreModule,\n} from '../../stores/index';\nimport {\n  DEFAULT_RULES_ENGINE_OPTIONS,\n  RULES_ENGINE_OPTIONS,\n  RulesEngineServiceOptions,\n} from '../rules-engine.token';\nimport {\n  RulesEngineRunnerService,\n} from './rules-engine.runner.service';\n\n@NgModule({\n  imports: [\n    StoreModule,\n    RulesetsStoreModule,\n    LoggerModule\n  ]\n})\nexport class RulesEngineRunnerModule {\n  public static forRoot(options?: Partial<RulesEngineServiceOptions>): ModuleWithProviders<RulesEngineRunnerModule> {\n    const opts = options ? { ...DEFAULT_RULES_ENGINE_OPTIONS, ...options } : DEFAULT_RULES_ENGINE_OPTIONS;\n    return {\n      ngModule: RulesEngineRunnerModule,\n      providers: [\n        { provide: RULES_ENGINE_OPTIONS, useValue: opts },\n        RulesEngineRunnerService\n      ]\n    };\n  }\n}\n","import {\n  InjectionToken,\n} from '@angular/core';\nimport {\n  RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit.interface';\n\nexport const OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS: Readonly<RulesEngineDevtoolsServiceOptions> = {\n  isActivatedOnBootstrap: false\n} as const;\n\nexport const OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS = new InjectionToken<RulesEngineDevtoolsServiceOptions>('Otter RulesEngine Devtools options');\n","import {\n  Inject,\n  Injectable,\n  Optional,\n} from '@angular/core';\nimport {\n  select,\n  Store,\n} from '@ngrx/store';\nimport {\n  combineLatest,\n  firstValueFrom,\n  Observable,\n} from 'rxjs';\nimport {\n  map,\n  scan,\n  shareReplay,\n} from 'rxjs/operators';\nimport type {\n  ActiveRulesetsEvent,\n  AvailableRulesets,\n  BaseRulesetExecution,\n  DebugEvent,\n  Ruleset,\n  RulesetExecutionErrorEvent,\n  RulesetExecutionEvent,\n} from '../engine';\nimport {\n  RulesEngineRunnerService,\n} from '../services';\nimport {\n  RulesetsModel,\n  RulesetsStore,\n  selectRulesetsEntities,\n} from '../stores';\nimport {\n  RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit.interface';\nimport {\n  OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n  OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools.token';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class OtterRulesEngineDevtools {\n  /** Stream of rules engine report */\n  public readonly rulesEngineReport$?: Observable<{ events: DebugEvent[]; rulesetMap: Record<string, Ruleset> }>;\n\n  /** Stream of rules engine event */\n  public readonly rulesEngineEvents$?: Observable<DebugEvent[]>;\n\n  /**\n   * Return true if the rules engine debug option is activated\n   */\n  public get isRulesEngineDebugActivated(): boolean {\n    return !!this.rulesEngineService.engine.debugMode;\n  }\n\n  constructor(\n    protected store: Store<RulesetsStore>,\n    private readonly rulesEngineService: RulesEngineRunnerService,\n    @Optional() @Inject(OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS) options: RulesEngineDevtoolsServiceOptions) {\n    const eventsStackLimit = (options || OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS).rulesEngineStackLimit;\n    this.rulesEngineEvents$ = this.rulesEngineService.engine.engineDebug?.debugEvents$.pipe(\n      scan((previousEvents, currentEvent) => {\n        const stack = eventsStackLimit && previousEvents.length === eventsStackLimit ? previousEvents.slice(1) : previousEvents;\n        return [...stack, currentEvent];\n      }, [] as DebugEvent[]),\n      shareReplay(1)\n    );\n\n    this.rulesEngineReport$ = this.rulesEngineEvents$ && combineLatest([this.rulesEngineEvents$, this.store.pipe(select(selectRulesetsEntities))]).pipe(\n      map(([events, rulesetEntities]) => {\n        const rulesetMap: Record<string, Ruleset> = Object.entries(rulesetEntities)\n          .reduce<Record<string, RulesetsModel>>((acc, [id, ruleset]) => {\n            if (ruleset) {\n              acc[id] = ruleset;\n            }\n            return acc;\n          }, {});\n        return { events, rulesetMap };\n      }),\n      shareReplay(1)\n    );\n  }\n\n  /** Return the list of debug events emitted by rules engine */\n  public async getCurrentRulesEngineEventsStack(): Promise<DebugEvent[] | undefined> {\n    return this.rulesEngineEvents$ && firstValueFrom(this.rulesEngineEvents$);\n  }\n\n  /** Returns the list of active rulesets (name and id) at the moment when the function is called */\n  public async getActiveRulesets() {\n    const lastActiveRulesetsEvent = (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter((e) => e.type === 'ActiveRulesets').reverse()[0];\n    return (lastActiveRulesetsEvent as ActiveRulesetsEvent)?.rulesets;\n  }\n\n  /** Returns the list of available rulesets (name and id) at the moment when the function is called */\n  public async getAvailableRulesets() {\n    const lastAvailableRulesetsEvent = (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter((e) => e.type === 'AvailableRulesets').reverse()[0];\n    return (lastAvailableRulesetsEvent as AvailableRulesets)?.availableRulesets;\n  }\n\n  /** Returns the list of output actions emitted by the rules engine at the moment when the function is called */\n  public async getAllOutputActions() {\n    return (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter((e) => e.type === 'AllActions')?.reverse()[0];\n  }\n\n  /**\n   * Get the list of executions for the given ruleset\n   * @param rulesetId\n   */\n  public async getRulesetExecutions(rulesetId: string): Promise<(RulesetExecutionEvent | RulesetExecutionErrorEvent)[] | undefined> {\n    return (this.rulesEngineEvents$ && await firstValueFrom(this.rulesEngineEvents$))?.filter(\n      (e): e is RulesetExecutionEvent | RulesetExecutionErrorEvent =>\n        (e.type === 'RulesetExecution' || e.type === 'RulesetExecutionError')\n        && (e as BaseRulesetExecution).rulesetId === rulesetId);\n  }\n\n  /**\n   * Check if the ruleset is activ in the moment when the function is called\n   * @param rulesetId\n   * @returns True if the ruleset is active; False if the ruleset is inactive or it does not exist\n   */\n  public async isRulesetActive(rulesetId: string) {\n    return !!(await this.getActiveRulesets())?.find((r) => r.id === rulesetId);\n  }\n\n  /**\n   * Get the list of rules executed for the specified ruleset\n   * @param rulesetId\n   */\n  public async getRulesEvaluationsForRuleset(rulesetId: string) {\n    const rulesetExec = await this.getRulesetExecutions(rulesetId);\n    return rulesetExec?.map((e) => (e as BaseRulesetExecution)?.rulesEvaluations?.filter((re) => !re.cached)).flat();\n  }\n\n  /**\n   * Get the list of input facts (name, current value) for the specified ruleset, at the moment when the function is called\n   * @param rulesetId\n   */\n  public async getInputFactsForRuleset(rulesetId: string) {\n    const rulesetExecutions = await this.getRulesetExecutions(rulesetId);\n    return rulesetExecutions ? (rulesetExecutions.at(-1) as BaseRulesetExecution).inputFacts : undefined;\n  }\n\n  /**\n   * Get the list of triggers for the specified ruleset\n   * @param rulesetId\n   */\n  public async getTriggersForRuleset(rulesetId: string) {\n    return (await this.getRulesEvaluationsForRuleset(rulesetId))?.map((e) => e.triggers).flat().flatMap((triggersMap) => Object.values(triggersMap));\n  }\n\n  /**\n   * Get the list of outputed actions emitted by the given ruleset, at the moment when the function is called\n   * @param rulesetId\n   */\n  public async getOutputActionsForRuleset(rulesetId: string) {\n    const rulesetExecutions = await this.getRulesetExecutions(rulesetId);\n    return rulesetExecutions ? (rulesetExecutions.at(-1) as RulesetExecutionEvent).outputActions : undefined;\n  }\n\n  /** Get the list of fact names and corresponding values */\n  public getAllFactsSnapshot() {\n    const registeredFacts = this.rulesEngineService?.engine.getRegisteredFactsNames();\n    if (registeredFacts) {\n      return this.rulesEngineService.engine.engineDebug?.getFactsSnapshot(registeredFacts);\n    }\n  }\n\n  /**\n   * Retrieve the ruleset information (rules, linkedComponents, validity range etc.) for a ruleset id\n   * @param rulesetId\n   */\n  public getRulesetInformation(rulesetId: string): Promise<Ruleset | undefined> {\n    return firstValueFrom(this.store.pipe(\n      select(selectRulesetsEntities),\n      map((entities) => entities[rulesetId] as Ruleset | undefined)\n    ));\n  }\n}\n","/* eslint-disable no-console -- purpose of the service is to log in the console */\nimport {\n  Inject,\n  Injectable,\n  Optional,\n} from '@angular/core';\nimport type {\n  DevtoolsServiceInterface,\n  WindowWithDevtools,\n} from '@o3r/core';\nimport {\n  RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit.interface';\nimport {\n  OtterRulesEngineDevtools,\n} from './rules-engine-devtools.service';\nimport {\n  OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n  OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools.token';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class RulesEngineDevtoolsConsoleService implements DevtoolsServiceInterface {\n  /** Name of the Window property to access to the devtools */\n  public static readonly windowModuleName = 'rulesEngine';\n\n  private readonly options: RulesEngineDevtoolsServiceOptions;\n\n  constructor(\n    private readonly rulesEngineDevtools: OtterRulesEngineDevtools,\n    @Optional() @Inject(OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS) options?: RulesEngineDevtoolsServiceOptions\n  ) {\n    this.options = {\n      ...OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n      ...options\n    };\n\n    if (this.options.isActivatedOnBootstrap) {\n      this.activate();\n    }\n  }\n\n  /** @inheritDoc */\n  public activate() {\n    const windowWithDevtools: WindowWithDevtools = window;\n    windowWithDevtools._OTTER_DEVTOOLS_ ||= {};\n    windowWithDevtools._OTTER_DEVTOOLS_[RulesEngineDevtoolsConsoleService.windowModuleName] = this;\n\n    console.info(`Otter rules engine Devtools is now accessible via the _OTTER_DEVTOOLS_.${RulesEngineDevtoolsConsoleService.windowModuleName} variable`);\n  }\n\n  /** Return the list of debug events emitted by rules engine */\n  public async getCurrentRulesEngineEventsStack() {\n    console.log(await this.rulesEngineDevtools.getCurrentRulesEngineEventsStack());\n  }\n\n  /** Returns the list of active rulesets (name and id) at the moment when the function is called */\n  public async getActiveRulesets() {\n    console.log(await this.rulesEngineDevtools.getActiveRulesets());\n  }\n\n  /** Returns the list of available rulesets (name and id) at the moment when the function is called */\n  public async getAvailableRulesets() {\n    console.log(await this.rulesEngineDevtools.getAvailableRulesets());\n  }\n\n  /** Returns the list of output actions emitted by the rules engine at the moment when the function is called */\n  public async getAllOutputActions() {\n    console.log(await this.rulesEngineDevtools.getAllOutputActions());\n  }\n\n  /**\n   * Get the list of executions for the given ruleset\n   * @param rulesetId\n   */\n  public async getRulesetExecutions(rulesetId: string) {\n    console.log(await this.rulesEngineDevtools.getRulesetExecutions(rulesetId));\n  }\n\n  /**\n   * Check if the ruleset is activ in the moment when the function is called\n   * @param rulesetId\n   * @returns True if the ruleset is active; False if the ruleset is inactive or it does not exist\n   */\n  public async isRulesetActive(rulesetId: string) {\n    console.log(await this.rulesEngineDevtools.isRulesetActive(rulesetId));\n  }\n\n  /**\n   * Get the list of rules executed for the specified ruleset\n   * @param rulesetId\n   */\n  public async getRulesEvaluationsForRuleset(rulesetId: string) {\n    console.log(await this.rulesEngineDevtools.getRulesEvaluationsForRuleset(rulesetId));\n  }\n\n  /**\n   * Get the list of input facts (name, current value) for the specified ruleset, at the moment when the function is called\n   * @param rulesetId\n   */\n  public async getInputFactsForRuleset(rulesetId: string) {\n    console.log(await this.rulesEngineDevtools.getInputFactsForRuleset(rulesetId));\n  }\n\n  /**\n   * Get the list of triggers for the specified ruleset\n   * @param rulesetId\n   */\n  public async getTriggersForRuleset(rulesetId: string) {\n    console.log(await this.rulesEngineDevtools.getTriggersForRuleset(rulesetId));\n  }\n\n  /**\n   * Get the list of outputed actions emitted by the given ruleset, at the moment when the function is called\n   * @param rulesetId\n   */\n  public async getOutputActionsForRuleset(rulesetId: string) {\n    console.log(await this.rulesEngineDevtools.getOutputActionsForRuleset(rulesetId));\n  }\n\n  /** Get the list of fact names and corresponding values */\n  public async getAllFactsSnapshot() {\n    console.log(await this.rulesEngineDevtools.getAllFactsSnapshot());\n  }\n\n  /**\n   * Retrieve the ruleset information (rules, linkedComponents, validity range etc.) for a ruleset id\n   * @param rulesetId\n   */\n  public async getRulesetInformation(rulesetId: string) {\n    console.log(await this.rulesEngineDevtools.getRulesetInformation(rulesetId));\n  }\n}\n","import {\n  DestroyRef,\n  inject,\n  Inject,\n  Injectable,\n  Optional,\n} from '@angular/core';\nimport {\n  takeUntilDestroyed,\n} from '@angular/core/rxjs-interop';\nimport {\n  DevtoolsServiceInterface,\n  filterMessageContent,\n  sendOtterMessage,\n} from '@o3r/core';\nimport {\n  LoggerService,\n} from '@o3r/logger';\nimport {\n  BehaviorSubject,\n  combineLatest,\n  fromEvent,\n} from 'rxjs';\nimport type {\n  DebugEvent,\n} from '../engine';\nimport {\n  AvailableRulesEngineMessageContents,\n  isRulesEngineMessage,\n  RulesEngineDevtoolsServiceOptions,\n  RulesEngineMessageDataTypes,\n} from './rules-engine-devkit.interface';\nimport {\n  OtterRulesEngineDevtools,\n} from './rules-engine-devtools.service';\nimport {\n  OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n  OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools.token';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class RulesEngineDevtoolsMessageService implements DevtoolsServiceInterface {\n  private readonly options: RulesEngineDevtoolsServiceOptions;\n  private readonly forceEmitRulesEngineReport = new BehaviorSubject<void>(undefined);\n  private readonly sendMessage = sendOtterMessage<AvailableRulesEngineMessageContents>;\n  private readonly destroyRef = inject(DestroyRef);\n\n  constructor(\n    private readonly rulesEngineDevtools: OtterRulesEngineDevtools,\n    private readonly logger: LoggerService,\n    @Optional() @Inject(OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS) options?: RulesEngineDevtoolsServiceOptions) {\n    this.options = {\n      ...OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n      ...options\n    };\n\n    if (this.options.isActivatedOnBootstrap) {\n      this.activate();\n    }\n  }\n\n  /**\n   * Function to trigger a re-send a requested messages to the Otter Chrome DevTools extension\n   * @param only restricted list of messages to re-send\n   */\n  private handleReEmitRequest(only?: RulesEngineMessageDataTypes[]) {\n    if (!only || only.includes('rulesEngineEvents')) {\n      this.forceEmitRulesEngineReport.next();\n    }\n  }\n\n  /**\n   * Function to handle the incoming messages from Otter Chrome DevTools extension\n   * @param message\n   */\n  private handleEvents(message: AvailableRulesEngineMessageContents) {\n    this.logger.debug('Message handling by the configuration service', message);\n\n    switch (message.dataType) {\n      case 'connect': {\n        this.connectPlugin();\n        break;\n      }\n      case 'requestMessages': {\n        this.handleReEmitRequest(message.only);\n        break;\n      }\n      default: {\n        this.logger.warn('Message ignored by the configuration service', message);\n      }\n    }\n  }\n\n  private readonly serializeError = (error: any) => error instanceof Error ? error.toString() : error;\n\n  /**\n   * Serialize exceptions in a way that will display the error message after a JSON.stringify()\n   * @param debugEvent\n   */\n  private serializeReportEvent(debugEvent: DebugEvent) {\n    if (debugEvent.type !== 'RulesetExecutionError') {\n      return debugEvent;\n    }\n    return {\n      ...debugEvent,\n      rulesEvaluations: debugEvent.rulesEvaluations.map((ruleEvaluation) => ({\n        ...ruleEvaluation,\n        error: this.serializeError(ruleEvaluation.error)\n      })),\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-return -- type is explicitly `any`\n      errors: debugEvent.errors.map((error) => this.serializeError(error))\n    };\n  }\n\n  /**\n   * Function to start the rules engine reporting to the Otter Chrome DevTools extension\n   */\n  private startRulesEngineReport() {\n    if (this.rulesEngineDevtools.rulesEngineReport$) {\n      combineLatest([\n        this.forceEmitRulesEngineReport,\n        this.rulesEngineDevtools.rulesEngineReport$\n      ]).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(\n        ([,report]) => {\n          const sanitizedReport = { ...report, events: report.events.map((reportEvents) => this.serializeReportEvent(reportEvents)) };\n          this.sendMessage('rulesEngineEvents', sanitizedReport);\n        }\n      );\n    }\n  }\n\n  /**\n   * Function to connect the plugin to the Otter DevTools extension\n   */\n  private connectPlugin() {\n    this.logger.info('Otter DevTools is plugged to the application');\n    this.forceEmitRulesEngineReport.next();\n  }\n\n  /** Activate the Otter DevTools */\n  public activate() {\n    this.startRulesEngineReport();\n\n    fromEvent(window, 'message').pipe(\n      takeUntilDestroyed(this.destroyRef),\n      filterMessageContent(isRulesEngineMessage)\n    ).subscribe((e) => this.handleEvents(e));\n  }\n}\n","import {\n  ModuleWithProviders,\n  NgModule,\n} from '@angular/core';\nimport {\n  StoreModule,\n} from '@ngrx/store';\nimport {\n  RulesetsStoreModule,\n} from '../stores/index';\nimport type {\n  RulesEngineDevtoolsServiceOptions,\n} from './rules-engine-devkit.interface';\nimport {\n  RulesEngineDevtoolsConsoleService,\n} from './rules-engine-devtools.console.service';\nimport {\n  RulesEngineDevtoolsMessageService,\n} from './rules-engine-devtools.message.service';\nimport {\n  OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS,\n  OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS,\n} from './rules-engine-devtools.token';\n\n@NgModule({\n  imports: [\n    StoreModule,\n    RulesetsStoreModule\n  ],\n  providers: [\n    { provide: OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, useValue: OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS },\n    RulesEngineDevtoolsMessageService,\n    RulesEngineDevtoolsConsoleService\n  ]\n})\nexport class RulesEngineDevtoolsModule {\n  /**\n   * Initialize Otter Devtools\n   * @param options\n   */\n  public static instrument(options: Partial<RulesEngineDevtoolsServiceOptions>): ModuleWithProviders<RulesEngineDevtoolsModule> {\n    return {\n      ngModule: RulesEngineDevtoolsModule,\n      providers: [\n        { provide: OTTER_RULES_ENGINE_DEVTOOLS_OPTIONS, useValue: { ...OTTER_RULES_ENGINE_DEVTOOLS_DEFAULT_OPTIONS, ...options }, multi: false },\n        RulesEngineDevtoolsMessageService,\n        RulesEngineDevtoolsConsoleService\n      ]\n    };\n  }\n}\n","import {\n  FactDefinitions,\n  FactSet,\n} from '../engine/index';\nimport {\n  RulesEngineRunnerService,\n} from '../services/runner/rules-engine.runner.service';\n\n/** Abstract fact set service */\nexport abstract class FactsService<T extends FactDefinitions> {\n  /** Set of facts provided */\n  public abstract facts: FactSet<T>;\n\n  constructor(private readonly rulesEngine: RulesEngineRunnerService) {}\n\n  /** Register the set of facts */\n  public register() {\n    this.rulesEngine.upsertFacts(\n      Object.entries(this.facts)\n        .map(([id, factValue]) => ({ id, value$: factValue }))\n    );\n  }\n}\n","import {\n  Injectable,\n} from '@angular/core';\nimport {\n  BehaviorSubject,\n} from 'rxjs';\nimport {\n  FactsService,\n} from '../../fact';\nimport {\n  RulesEngineRunnerService,\n} from '../../services';\nimport {\n  CurrentTimeFacts,\n} from './current-time.facts';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class CurrentTimeFactsService extends FactsService<CurrentTimeFacts> {\n  private readonly currentTimeSubject$ = new BehaviorSubject(Date.now());\n  /** @inheritDoc */\n  public facts = {\n    o3rCurrentTime: this.currentTimeSubject$.asObservable()\n  };\n\n  constructor(rulesEngine: RulesEngineRunnerService) {\n    super(rulesEngine);\n  }\n\n  /** Compute the current time */\n  public tick() {\n    this.currentTimeSubject$.next(Date.now());\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1","actions.resetRulesets","actions.setRulesets","actions.cancelRulesetsRequest","actions.updateRulesets","actions.setRulesetsEntities","actions.upsertRulesetsEntities","actions.clearRulesetsEntities","actions.failRulesetsEntities","actions.setRulesetsEntitiesFromApi","actions.upsertRulesetsEntitiesFromApi","i2","isValidDate","i1.RulesEngineRunnerService"],"mappings":"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"}