Files
botino/package.json
Lucas Tettamanti 04ac33430f Tier 2: XState statechart como motor de turno (opt-in)
Reemplaza el dispatcher en turnEngineV3.js por un statechart formal en
XState v5. La machine es pura: produce un effect log (pending_actions) +
un descriptor de reply (pending_reply) que el runner traduce afuera.

API externa intacta: runTurnV3 sigue retornando { plan, decision } con
shape compatible con pipeline.js. Snapshot persiste en
context.xstate_snapshot dentro del JSONB existente.

- machine/index.js: statechart top-level (idle/cart/shipping/payment/
  waiting/awaiting_human) + cart sub-statechart con todo el flujo
  multi-turno (searching/resolving/askingClarification/askingQuantity/
  computingFromPersonas/added/showing/pricing/researching).
- guards.js: portados de fsm.js (hasCart, wantsToAddProduct, etc).
- actions.js: assigns para mutations + reply descriptors (pending_reply
  con templateKey/vars/rawText). Las async no entran en la machine.
- actors.js: fromPromise wrappers de retrieveCandidates y getProductQtyRules.
- runner.js: boot con prev_context.xstate_snapshot o migrateOldContext.
  NLU → nluToEvent → send → settle (espera invokes) → realizeReply
  (renderReply real con rewriter) → getPersistedSnapshot → format.
- nluToEvent.js: adapter NLU intent → evento XState (1:1).

Feature flags: USE_XSTATE=1 reemplaza el path; XSTATE_SHADOW=1 corre
ambos en paralelo, devuelve legacy y loguea diffs estructurales para
validar antes de flippar prod.

16 unit tests para la machine cubren: arranque, regla universal cart-on-add,
flow de cart con strong/multi match, checkout completo (shipping/pickup/
payment/cash) y rehidratación de snapshot. 224 tests totales pasando.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-01 20:38:26 -03:00

42 lines
1006 B
JSON

{
"name": "botino",
"version": "1.0.0",
"description": "API base con Express",
"main": "index.js",
"type": "module",
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js",
"test": "vitest run",
"test:watch": "vitest",
"test:coverage": "vitest run --coverage",
"migrate:up": "dbmate up",
"migrate:down": "dbmate down",
"migrate:redo": "dbmate rollback && dbmate up",
"migrate:status": "dbmate status",
"seed": "node scripts/seed-tenant.mjs"
},
"keywords": [],
"author": "Lucas Tettamanti",
"license": "MIT",
"dependencies": {
"ajv": "^8.17.1",
"cors": "^2.8.5",
"csv-parse": "^6.1.0",
"dbmate": "^2.0.0",
"dotenv": "^17.2.3",
"express": "^4.19.2",
"mysql2": "^3.16.2",
"openai": "^6.15.0",
"pg": "^8.16.3",
"undici": "^7.16.0",
"xstate": "^5.31.0",
"zod": "^4.3.4"
},
"devDependencies": {
"@vitest/coverage-v8": "^4.0.18",
"nodemon": "^3.0.3",
"vitest": "^4.0.18"
}
}