/** * Actores XState (fromPromise) — wrappers de side effects async. * La machine es pura; estos actores aíslan llamadas a DB / WooCommerce / LLM. */ import { fromPromise } from "xstate"; import { retrieveCandidates } from "../catalogRetrieval.js"; import { getProductQtyRules } from "../../0-ui/db/repo.js"; /** * Busca candidatos para una lista de queries de producto. * Input: { tenantId, items: [{product_query, quantity, unit}, ...] } * Output: array paralelo a items con { query, quantity, unit, candidates } */ export const searchCatalogActor = fromPromise(async ({ input }) => { const { tenantId, items = [] } = input || {}; const results = []; for (const it of items) { if (!it?.product_query) continue; const r = await retrieveCandidates({ tenantId, query: it.product_query, limit: 20 }); results.push({ query: it.product_query, quantity: it.quantity ?? null, unit: it.unit ?? null, candidates: r?.candidates || [], }); } return results; }); /** * Lookup de qty rules para un producto. * Input: { tenantId, wooProductId } * Output: array de rules */ export const getQtyRulesActor = fromPromise(async ({ input }) => { const { tenantId, wooProductId } = input || {}; if (!tenantId || !wooProductId) return []; return await getProductQtyRules({ tenantId, wooProductId }); }); export const actors = { searchCatalogActor, getQtyRulesActor, };