retrainLearnedFromRules function exported ✓ 84.0%

Last updated: 2026-02-25T14:02:03.587Z

Metrics

LOC: 71 Complexity: 3 Params: 2 Coverage: 84.0% (21/25 lines, 4x executed)

Signature

retrainLearnedFromRules( rules: FieldRule[], ): : Promise<RetrainResult>

Summary

Rebuild learned entries from the currently configured rules.

Source Code

export async function retrainLearnedFromRules(
  rules: FieldRule[],
): Promise<RetrainResult> {
  const t0 = Date.now();

  log.info(`Iniciando retreino: ${rules.length} regra(s) encontrada(s).`);

  const prevCount = await getLearnedCount();
  log.debug(`Entradas aprendidas antes do retreino: ${prevCount}`);

  // Only remove rule-derived entries; organic (auto) entries are preserved.
  await clearRuleDerivedEntries();
  log.debug(
    "Entradas de regras anteriores removidas do storage (entradas orgânicas preservadas).",
  );

  let imported = 0;
  let skipped = 0;
  const details: RetrainDetail[] = [];

  for (const rule of rules) {
    const signals = buildSignalsFromRule(rule);
    if (!signals) {
      log.warn(
        `Regra ignorada (sem signals): id=${rule.id} selector=${rule.fieldSelector}`,
      );
      details.push({
        ruleId: rule.id,
        selector: rule.fieldSelector,
        type: rule.fieldType,
        signals: "",
        status: "skipped",
      });
      skipped += 1;
      continue;
    }

    await storeLearnedEntry(signals, rule.fieldType, undefined, "rule");
    await addDatasetEntry({
      signals,
      type: rule.fieldType,
      source: "manual",
      difficulty: "easy",
    });
    details.push({
      ruleId: rule.id,
      selector: rule.fieldSelector,
      type: rule.fieldType,
      signals,
      status: "imported",
    });
    imported += 1;
    log.debug(
      `  ✔ ${rule.fieldType.padEnd(12)} ← "${signals.slice(0, 80)}" (${rule.fieldSelector})`,
    );
  }

  const durationMs = Date.now() - t0;

  log.info(
    `Retreino finalizado em ${durationMs}ms. ` +
      `Importadas: ${imported}, Ignoradas: ${skipped}`,
  );
  log.debug(
    "NOTA: este retreino atualiza apenas os vetores de " +
      "aprendizado (cosine similarity). Os pesos da rede neural TF.js NÃO " +
      "são alterados. Para retreinar o modelo neural, execute: npm run train:model",
  );

  return { imported, skipped, totalRules: rules.length, durationMs, details };
}

Dependencies (Outgoing)

graph LR retrainLearnedFromRules["retrainLearnedFromRules"] getLearnedCount["getLearnedCount"] clearRuleDerivedEntries["clearRuleDerivedEntries"] buildSignalsFromRule["buildSignalsFromRule"] storeLearnedEntry["storeLearnedEntry"] retrainLearnedFromRules -->|calls| getLearnedCount retrainLearnedFromRules -->|calls| clearRuleDerivedEntries retrainLearnedFromRules -->|calls| buildSignalsFromRule retrainLearnedFromRules -->|calls| storeLearnedEntry style retrainLearnedFromRules fill:#dbeafe,stroke:#2563eb,stroke-width:2px click retrainLearnedFromRules "d3f53e03267ff965.html" click getLearnedCount "8b7da605b1b28e60.html" click clearRuleDerivedEntries "dae0934e126ec955.html" click buildSignalsFromRule "4c1a03d6233ed8c2.html" click storeLearnedEntry "2904bc5fab5c017a.html"

Impact (Incoming)

graph LR retrainLearnedFromRules["retrainLearnedFromRules"] handle["handle"] makeEntry["makeEntry"] handle -->|uses| retrainLearnedFromRules makeEntry -->|uses| retrainLearnedFromRules style retrainLearnedFromRules fill:#dbeafe,stroke:#2563eb,stroke-width:2px click retrainLearnedFromRules "d3f53e03267ff965.html" click handle "2aca809332a83745.html" click makeEntry "51dbe567b29f8f6e.html"
SourceType
handle uses
makeEntry uses