@patroltech/agent-capabilities 0.0.0-stage → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +171 -2
  3. package/dist/actions/alerts.d.ts +3 -0
  4. package/dist/actions/alerts.d.ts.map +1 -0
  5. package/dist/actions/alerts.js +90 -0
  6. package/dist/actions/alerts.js.map +1 -0
  7. package/dist/actions/batch-policy.d.ts +67 -0
  8. package/dist/actions/batch-policy.d.ts.map +1 -0
  9. package/dist/actions/batch-policy.js +73 -0
  10. package/dist/actions/batch-policy.js.map +1 -0
  11. package/dist/actions/checkpoint-archive.d.ts +3 -0
  12. package/dist/actions/checkpoint-archive.d.ts.map +1 -0
  13. package/dist/actions/checkpoint-archive.js +173 -0
  14. package/dist/actions/checkpoint-archive.js.map +1 -0
  15. package/dist/actions/checkpoint-geo.d.ts +4 -0
  16. package/dist/actions/checkpoint-geo.d.ts.map +1 -0
  17. package/dist/actions/checkpoint-geo.js +286 -0
  18. package/dist/actions/checkpoint-geo.js.map +1 -0
  19. package/dist/actions/checkpoints.d.ts +10 -0
  20. package/dist/actions/checkpoints.d.ts.map +1 -0
  21. package/dist/actions/checkpoints.js +222 -0
  22. package/dist/actions/checkpoints.js.map +1 -0
  23. package/dist/actions/guard.d.ts +13 -0
  24. package/dist/actions/guard.d.ts.map +1 -0
  25. package/dist/actions/guard.js +30 -0
  26. package/dist/actions/guard.js.map +1 -0
  27. package/dist/actions/incidents.d.ts +3 -0
  28. package/dist/actions/incidents.d.ts.map +1 -0
  29. package/dist/actions/incidents.js +260 -0
  30. package/dist/actions/incidents.js.map +1 -0
  31. package/dist/actions/index.d.ts +20 -0
  32. package/dist/actions/index.d.ts.map +1 -0
  33. package/dist/actions/index.js +60 -0
  34. package/dist/actions/index.js.map +1 -0
  35. package/dist/actions/locations.d.ts +4 -0
  36. package/dist/actions/locations.d.ts.map +1 -0
  37. package/dist/actions/locations.js +202 -0
  38. package/dist/actions/locations.js.map +1 -0
  39. package/dist/actions/names.d.ts +27 -0
  40. package/dist/actions/names.d.ts.map +1 -0
  41. package/dist/actions/names.js +48 -0
  42. package/dist/actions/names.js.map +1 -0
  43. package/dist/actions/patrollers.d.ts +6 -0
  44. package/dist/actions/patrollers.d.ts.map +1 -0
  45. package/dist/actions/patrollers.js +172 -0
  46. package/dist/actions/patrollers.js.map +1 -0
  47. package/dist/actions/route-schedules.d.ts +4 -0
  48. package/dist/actions/route-schedules.d.ts.map +1 -0
  49. package/dist/actions/route-schedules.js +110 -0
  50. package/dist/actions/route-schedules.js.map +1 -0
  51. package/dist/actions/routes.d.ts +5 -0
  52. package/dist/actions/routes.d.ts.map +1 -0
  53. package/dist/actions/routes.js +348 -0
  54. package/dist/actions/routes.js.map +1 -0
  55. package/dist/actions/support/antifraud-rules.d.ts +53 -0
  56. package/dist/actions/support/antifraud-rules.d.ts.map +1 -0
  57. package/dist/actions/support/antifraud-rules.js +121 -0
  58. package/dist/actions/support/antifraud-rules.js.map +1 -0
  59. package/dist/actions/support/elegir-ubicacion.d.ts +31 -0
  60. package/dist/actions/support/elegir-ubicacion.d.ts.map +1 -0
  61. package/dist/actions/support/elegir-ubicacion.js +42 -0
  62. package/dist/actions/support/elegir-ubicacion.js.map +1 -0
  63. package/dist/actions/support/next-step.d.ts +26 -0
  64. package/dist/actions/support/next-step.d.ts.map +1 -0
  65. package/dist/actions/support/next-step.js +55 -0
  66. package/dist/actions/support/next-step.js.map +1 -0
  67. package/dist/actions/support/route-impact.d.ts +25 -0
  68. package/dist/actions/support/route-impact.d.ts.map +1 -0
  69. package/dist/actions/support/route-impact.js +76 -0
  70. package/dist/actions/support/route-impact.js.map +1 -0
  71. package/dist/actions/support/route-lookup.d.ts +27 -0
  72. package/dist/actions/support/route-lookup.d.ts.map +1 -0
  73. package/dist/actions/support/route-lookup.js +44 -0
  74. package/dist/actions/support/route-lookup.js.map +1 -0
  75. package/dist/actions/support/schedule.d.ts +38 -0
  76. package/dist/actions/support/schedule.d.ts.map +1 -0
  77. package/dist/actions/support/schedule.js +62 -0
  78. package/dist/actions/support/schedule.js.map +1 -0
  79. package/dist/actions/support/shared.d.ts +112 -0
  80. package/dist/actions/support/shared.d.ts.map +1 -0
  81. package/dist/actions/support/shared.js +171 -0
  82. package/dist/actions/support/shared.js.map +1 -0
  83. package/dist/actions/support/texts.d.ts +47 -0
  84. package/dist/actions/support/texts.d.ts.map +1 -0
  85. package/dist/actions/support/texts.js +134 -0
  86. package/dist/actions/support/texts.js.map +1 -0
  87. package/dist/actions/support/turno.d.ts +16 -0
  88. package/dist/actions/support/turno.d.ts.map +1 -0
  89. package/dist/actions/support/turno.js +35 -0
  90. package/dist/actions/support/turno.js.map +1 -0
  91. package/dist/actions/support/user-access.d.ts +72 -0
  92. package/dist/actions/support/user-access.d.ts.map +1 -0
  93. package/dist/actions/support/user-access.js +194 -0
  94. package/dist/actions/support/user-access.js.map +1 -0
  95. package/dist/actions/types.d.ts +130 -0
  96. package/dist/actions/types.d.ts.map +1 -0
  97. package/dist/actions/types.js +20 -0
  98. package/dist/actions/types.js.map +1 -0
  99. package/dist/actions/user-roles.d.ts +4 -0
  100. package/dist/actions/user-roles.d.ts.map +1 -0
  101. package/dist/actions/user-roles.js +195 -0
  102. package/dist/actions/user-roles.js.map +1 -0
  103. package/dist/actions/users.d.ts +3 -0
  104. package/dist/actions/users.d.ts.map +1 -0
  105. package/dist/actions/users.js +146 -0
  106. package/dist/actions/users.js.map +1 -0
  107. package/dist/catalog/buildCatalog.d.ts +19 -0
  108. package/dist/catalog/buildCatalog.d.ts.map +1 -0
  109. package/dist/catalog/buildCatalog.js +38 -0
  110. package/dist/catalog/buildCatalog.js.map +1 -0
  111. package/dist/catalog/english.d.ts +17 -0
  112. package/dist/catalog/english.d.ts.map +1 -0
  113. package/dist/catalog/english.js +392 -0
  114. package/dist/catalog/english.js.map +1 -0
  115. package/dist/catalog/entries.d.ts +6 -0
  116. package/dist/catalog/entries.d.ts.map +1 -0
  117. package/dist/catalog/entries.js +610 -0
  118. package/dist/catalog/entries.js.map +1 -0
  119. package/dist/catalog/types.d.ts +61 -0
  120. package/dist/catalog/types.d.ts.map +1 -0
  121. package/dist/catalog/types.js +2 -0
  122. package/dist/catalog/types.js.map +1 -0
  123. package/dist/context.d.ts +37 -0
  124. package/dist/context.d.ts.map +1 -0
  125. package/dist/context.js +11 -0
  126. package/dist/context.js.map +1 -0
  127. package/dist/deps.d.ts +23 -0
  128. package/dist/deps.d.ts.map +1 -0
  129. package/dist/deps.js +12 -0
  130. package/dist/deps.js.map +1 -0
  131. package/dist/domain/access-logs-csv.d.ts +25 -0
  132. package/dist/domain/access-logs-csv.d.ts.map +1 -0
  133. package/dist/domain/access-logs-csv.js +36 -0
  134. package/dist/domain/access-logs-csv.js.map +1 -0
  135. package/dist/domain/backend-errors.d.ts +54 -0
  136. package/dist/domain/backend-errors.d.ts.map +1 -0
  137. package/dist/domain/backend-errors.js +364 -0
  138. package/dist/domain/backend-errors.js.map +1 -0
  139. package/dist/domain/country.d.ts +9 -0
  140. package/dist/domain/country.d.ts.map +1 -0
  141. package/dist/domain/country.js +13 -0
  142. package/dist/domain/country.js.map +1 -0
  143. package/dist/domain/date-range.d.ts +33 -0
  144. package/dist/domain/date-range.d.ts.map +1 -0
  145. package/dist/domain/date-range.js +110 -0
  146. package/dist/domain/date-range.js.map +1 -0
  147. package/dist/domain/geo.d.ts +14 -0
  148. package/dist/domain/geo.d.ts.map +1 -0
  149. package/dist/domain/geo.js +22 -0
  150. package/dist/domain/geo.js.map +1 -0
  151. package/dist/domain/guard-app-message.d.ts +15 -0
  152. package/dist/domain/guard-app-message.d.ts.map +1 -0
  153. package/dist/domain/guard-app-message.js +39 -0
  154. package/dist/domain/guard-app-message.js.map +1 -0
  155. package/dist/domain/incident-priority.d.ts +25 -0
  156. package/dist/domain/incident-priority.d.ts.map +1 -0
  157. package/dist/domain/incident-priority.js +15 -0
  158. package/dist/domain/incident-priority.js.map +1 -0
  159. package/dist/domain/incident-status.d.ts +29 -0
  160. package/dist/domain/incident-status.d.ts.map +1 -0
  161. package/dist/domain/incident-status.js +44 -0
  162. package/dist/domain/incident-status.js.map +1 -0
  163. package/dist/domain/language.d.ts +39 -0
  164. package/dist/domain/language.d.ts.map +1 -0
  165. package/dist/domain/language.js +112 -0
  166. package/dist/domain/language.js.map +1 -0
  167. package/dist/domain/money.d.ts +3 -0
  168. package/dist/domain/money.d.ts.map +1 -0
  169. package/dist/domain/money.js +12 -0
  170. package/dist/domain/money.js.map +1 -0
  171. package/dist/domain/puesta-en-marcha.d.ts +47 -0
  172. package/dist/domain/puesta-en-marcha.d.ts.map +1 -0
  173. package/dist/domain/puesta-en-marcha.js +22 -0
  174. package/dist/domain/puesta-en-marcha.js.map +1 -0
  175. package/dist/domain/qr-image.d.ts +25 -0
  176. package/dist/domain/qr-image.d.ts.map +1 -0
  177. package/dist/domain/qr-image.js +28 -0
  178. package/dist/domain/qr-image.js.map +1 -0
  179. package/dist/domain/resolve-by-name.d.ts +32 -0
  180. package/dist/domain/resolve-by-name.d.ts.map +1 -0
  181. package/dist/domain/resolve-by-name.js +40 -0
  182. package/dist/domain/resolve-by-name.js.map +1 -0
  183. package/dist/domain/route-checkpoints.d.ts +31 -0
  184. package/dist/domain/route-checkpoints.d.ts.map +1 -0
  185. package/dist/domain/route-checkpoints.js +27 -0
  186. package/dist/domain/route-checkpoints.js.map +1 -0
  187. package/dist/domain/route-schedule.d.ts +88 -0
  188. package/dist/domain/route-schedule.d.ts.map +1 -0
  189. package/dist/domain/route-schedule.js +203 -0
  190. package/dist/domain/route-schedule.js.map +1 -0
  191. package/dist/domain/scan-explanation.d.ts +25 -0
  192. package/dist/domain/scan-explanation.d.ts.map +1 -0
  193. package/dist/domain/scan-explanation.js +99 -0
  194. package/dist/domain/scan-explanation.js.map +1 -0
  195. package/dist/domain/scans-csv.d.ts +37 -0
  196. package/dist/domain/scans-csv.d.ts.map +1 -0
  197. package/dist/domain/scans-csv.js +67 -0
  198. package/dist/domain/scans-csv.js.map +1 -0
  199. package/dist/domain/timezone.d.ts +61 -0
  200. package/dist/domain/timezone.d.ts.map +1 -0
  201. package/dist/domain/timezone.js +113 -0
  202. package/dist/domain/timezone.js.map +1 -0
  203. package/dist/domain/tool-result.d.ts +55 -0
  204. package/dist/domain/tool-result.d.ts.map +1 -0
  205. package/dist/domain/tool-result.js +47 -0
  206. package/dist/domain/tool-result.js.map +1 -0
  207. package/dist/domain/urls.d.ts +33 -0
  208. package/dist/domain/urls.d.ts.map +1 -0
  209. package/dist/domain/urls.js +20 -0
  210. package/dist/domain/urls.js.map +1 -0
  211. package/dist/gateway/PatrolTechGateway.d.ts +195 -0
  212. package/dist/gateway/PatrolTechGateway.d.ts.map +1 -0
  213. package/dist/gateway/PatrolTechGateway.js +2 -0
  214. package/dist/gateway/PatrolTechGateway.js.map +1 -0
  215. package/dist/gateway/index.d.ts +4 -0
  216. package/dist/gateway/index.d.ts.map +1 -0
  217. package/dist/gateway/index.js +4 -0
  218. package/dist/gateway/index.js.map +1 -0
  219. package/dist/gateway/sdk/SdkPatrolTechGateway.d.ts +145 -0
  220. package/dist/gateway/sdk/SdkPatrolTechGateway.d.ts.map +1 -0
  221. package/dist/gateway/sdk/SdkPatrolTechGateway.js +101 -0
  222. package/dist/gateway/sdk/SdkPatrolTechGateway.js.map +1 -0
  223. package/dist/gateway/sdk/access.d.ts +8 -0
  224. package/dist/gateway/sdk/access.d.ts.map +1 -0
  225. package/dist/gateway/sdk/access.js +39 -0
  226. package/dist/gateway/sdk/access.js.map +1 -0
  227. package/dist/gateway/sdk/billing.d.ts +7 -0
  228. package/dist/gateway/sdk/billing.d.ts.map +1 -0
  229. package/dist/gateway/sdk/billing.js +92 -0
  230. package/dist/gateway/sdk/billing.js.map +1 -0
  231. package/dist/gateway/sdk/checkpoint-mappers.d.ts +23 -0
  232. package/dist/gateway/sdk/checkpoint-mappers.d.ts.map +1 -0
  233. package/dist/gateway/sdk/checkpoint-mappers.js +59 -0
  234. package/dist/gateway/sdk/checkpoint-mappers.js.map +1 -0
  235. package/dist/gateway/sdk/checkpoints.d.ts +33 -0
  236. package/dist/gateway/sdk/checkpoints.d.ts.map +1 -0
  237. package/dist/gateway/sdk/checkpoints.js +163 -0
  238. package/dist/gateway/sdk/checkpoints.js.map +1 -0
  239. package/dist/gateway/sdk/errors.d.ts +10 -0
  240. package/dist/gateway/sdk/errors.d.ts.map +1 -0
  241. package/dist/gateway/sdk/errors.js +46 -0
  242. package/dist/gateway/sdk/errors.js.map +1 -0
  243. package/dist/gateway/sdk/incidents.d.ts +18 -0
  244. package/dist/gateway/sdk/incidents.d.ts.map +1 -0
  245. package/dist/gateway/sdk/incidents.js +98 -0
  246. package/dist/gateway/sdk/incidents.js.map +1 -0
  247. package/dist/gateway/sdk/index.d.ts +4 -0
  248. package/dist/gateway/sdk/index.d.ts.map +1 -0
  249. package/dist/gateway/sdk/index.js +4 -0
  250. package/dist/gateway/sdk/index.js.map +1 -0
  251. package/dist/gateway/sdk/list.d.ts +15 -0
  252. package/dist/gateway/sdk/list.d.ts.map +1 -0
  253. package/dist/gateway/sdk/list.js +12 -0
  254. package/dist/gateway/sdk/list.js.map +1 -0
  255. package/dist/gateway/sdk/locations.d.ts +24 -0
  256. package/dist/gateway/sdk/locations.d.ts.map +1 -0
  257. package/dist/gateway/sdk/locations.js +44 -0
  258. package/dist/gateway/sdk/locations.js.map +1 -0
  259. package/dist/gateway/sdk/patrollers.d.ts +26 -0
  260. package/dist/gateway/sdk/patrollers.d.ts.map +1 -0
  261. package/dist/gateway/sdk/patrollers.js +132 -0
  262. package/dist/gateway/sdk/patrollers.js.map +1 -0
  263. package/dist/gateway/sdk/rounds.d.ts +15 -0
  264. package/dist/gateway/sdk/rounds.d.ts.map +1 -0
  265. package/dist/gateway/sdk/rounds.js +142 -0
  266. package/dist/gateway/sdk/rounds.js.map +1 -0
  267. package/dist/gateway/sdk/routes.d.ts +18 -0
  268. package/dist/gateway/sdk/routes.d.ts.map +1 -0
  269. package/dist/gateway/sdk/routes.js +74 -0
  270. package/dist/gateway/sdk/routes.js.map +1 -0
  271. package/dist/gateway/sdk/scans.d.ts +4 -0
  272. package/dist/gateway/sdk/scans.d.ts.map +1 -0
  273. package/dist/gateway/sdk/scans.js +72 -0
  274. package/dist/gateway/sdk/scans.js.map +1 -0
  275. package/dist/gateway/sdk/transport.d.ts +77 -0
  276. package/dist/gateway/sdk/transport.d.ts.map +1 -0
  277. package/dist/gateway/sdk/transport.js +81 -0
  278. package/dist/gateway/sdk/transport.js.map +1 -0
  279. package/dist/gateway/sdk/users.d.ts +15 -0
  280. package/dist/gateway/sdk/users.d.ts.map +1 -0
  281. package/dist/gateway/sdk/users.js +49 -0
  282. package/dist/gateway/sdk/users.js.map +1 -0
  283. package/dist/gateway/types/access.d.ts +32 -0
  284. package/dist/gateway/types/access.d.ts.map +1 -0
  285. package/dist/gateway/types/access.js +2 -0
  286. package/dist/gateway/types/access.js.map +1 -0
  287. package/dist/gateway/types/billing.d.ts +60 -0
  288. package/dist/gateway/types/billing.d.ts.map +1 -0
  289. package/dist/gateway/types/billing.js +2 -0
  290. package/dist/gateway/types/billing.js.map +1 -0
  291. package/dist/gateway/types/checkpoints.d.ts +84 -0
  292. package/dist/gateway/types/checkpoints.d.ts.map +1 -0
  293. package/dist/gateway/types/checkpoints.js +2 -0
  294. package/dist/gateway/types/checkpoints.js.map +1 -0
  295. package/dist/gateway/types/common.d.ts +13 -0
  296. package/dist/gateway/types/common.d.ts.map +1 -0
  297. package/dist/gateway/types/common.js +2 -0
  298. package/dist/gateway/types/common.js.map +1 -0
  299. package/dist/gateway/types/incidents.d.ts +53 -0
  300. package/dist/gateway/types/incidents.d.ts.map +1 -0
  301. package/dist/gateway/types/incidents.js +2 -0
  302. package/dist/gateway/types/incidents.js.map +1 -0
  303. package/dist/gateway/types/index.d.ts +12 -0
  304. package/dist/gateway/types/index.d.ts.map +1 -0
  305. package/dist/gateway/types/index.js +12 -0
  306. package/dist/gateway/types/index.js.map +1 -0
  307. package/dist/gateway/types/locations.d.ts +7 -0
  308. package/dist/gateway/types/locations.d.ts.map +1 -0
  309. package/dist/gateway/types/locations.js +2 -0
  310. package/dist/gateway/types/locations.js.map +1 -0
  311. package/dist/gateway/types/patrollers.d.ts +68 -0
  312. package/dist/gateway/types/patrollers.d.ts.map +1 -0
  313. package/dist/gateway/types/patrollers.js +15 -0
  314. package/dist/gateway/types/patrollers.js.map +1 -0
  315. package/dist/gateway/types/rounds.d.ts +89 -0
  316. package/dist/gateway/types/rounds.d.ts.map +1 -0
  317. package/dist/gateway/types/rounds.js +2 -0
  318. package/dist/gateway/types/rounds.js.map +1 -0
  319. package/dist/gateway/types/routes.d.ts +48 -0
  320. package/dist/gateway/types/routes.d.ts.map +1 -0
  321. package/dist/gateway/types/routes.js +2 -0
  322. package/dist/gateway/types/routes.js.map +1 -0
  323. package/dist/gateway/types/scans.d.ts +44 -0
  324. package/dist/gateway/types/scans.d.ts.map +1 -0
  325. package/dist/gateway/types/scans.js +2 -0
  326. package/dist/gateway/types/scans.js.map +1 -0
  327. package/dist/gateway/types/users.d.ts +32 -0
  328. package/dist/gateway/types/users.d.ts.map +1 -0
  329. package/dist/gateway/types/users.js +2 -0
  330. package/dist/gateway/types/users.js.map +1 -0
  331. package/dist/index.d.ts +32 -0
  332. package/dist/index.d.ts.map +1 -0
  333. package/dist/index.js +40 -0
  334. package/dist/index.js.map +1 -0
  335. package/dist/ports/FileSink.d.ts +20 -0
  336. package/dist/ports/FileSink.d.ts.map +1 -0
  337. package/dist/ports/FileSink.js +2 -0
  338. package/dist/ports/FileSink.js.map +1 -0
  339. package/dist/ports/Logger.d.ts +16 -0
  340. package/dist/ports/Logger.d.ts.map +1 -0
  341. package/dist/ports/Logger.js +7 -0
  342. package/dist/ports/Logger.js.map +1 -0
  343. package/dist/ports/PendingActionStore.d.ts +84 -0
  344. package/dist/ports/PendingActionStore.d.ts.map +1 -0
  345. package/dist/ports/PendingActionStore.js +16 -0
  346. package/dist/ports/PendingActionStore.js.map +1 -0
  347. package/dist/reads/access.d.ts +4 -0
  348. package/dist/reads/access.d.ts.map +1 -0
  349. package/dist/reads/access.js +129 -0
  350. package/dist/reads/access.js.map +1 -0
  351. package/dist/reads/checkpoints.d.ts +4 -0
  352. package/dist/reads/checkpoints.d.ts.map +1 -0
  353. package/dist/reads/checkpoints.js +152 -0
  354. package/dist/reads/checkpoints.js.map +1 -0
  355. package/dist/reads/files.d.ts +9 -0
  356. package/dist/reads/files.d.ts.map +1 -0
  357. package/dist/reads/files.js +222 -0
  358. package/dist/reads/files.js.map +1 -0
  359. package/dist/reads/incidents.d.ts +4 -0
  360. package/dist/reads/incidents.d.ts.map +1 -0
  361. package/dist/reads/incidents.js +159 -0
  362. package/dist/reads/incidents.js.map +1 -0
  363. package/dist/reads/index.d.ts +11 -0
  364. package/dist/reads/index.d.ts.map +1 -0
  365. package/dist/reads/index.js +51 -0
  366. package/dist/reads/index.js.map +1 -0
  367. package/dist/reads/onboarding.d.ts +4 -0
  368. package/dist/reads/onboarding.d.ts.map +1 -0
  369. package/dist/reads/onboarding.js +41 -0
  370. package/dist/reads/onboarding.js.map +1 -0
  371. package/dist/reads/organization.d.ts +26 -0
  372. package/dist/reads/organization.d.ts.map +1 -0
  373. package/dist/reads/organization.js +45 -0
  374. package/dist/reads/organization.js.map +1 -0
  375. package/dist/reads/patrollers.d.ts +11 -0
  376. package/dist/reads/patrollers.d.ts.map +1 -0
  377. package/dist/reads/patrollers.js +172 -0
  378. package/dist/reads/patrollers.js.map +1 -0
  379. package/dist/reads/plan.d.ts +4 -0
  380. package/dist/reads/plan.d.ts.map +1 -0
  381. package/dist/reads/plan.js +195 -0
  382. package/dist/reads/plan.js.map +1 -0
  383. package/dist/reads/rounds.d.ts +4 -0
  384. package/dist/reads/rounds.d.ts.map +1 -0
  385. package/dist/reads/rounds.js +160 -0
  386. package/dist/reads/rounds.js.map +1 -0
  387. package/dist/reads/routes.d.ts +4 -0
  388. package/dist/reads/routes.d.ts.map +1 -0
  389. package/dist/reads/routes.js +34 -0
  390. package/dist/reads/routes.js.map +1 -0
  391. package/dist/reads/support/access-locations.d.ts +22 -0
  392. package/dist/reads/support/access-locations.d.ts.map +1 -0
  393. package/dist/reads/support/access-locations.js +55 -0
  394. package/dist/reads/support/access-locations.js.map +1 -0
  395. package/dist/reads/support/excel.d.ts +10 -0
  396. package/dist/reads/support/excel.d.ts.map +1 -0
  397. package/dist/reads/support/excel.js +35 -0
  398. package/dist/reads/support/excel.js.map +1 -0
  399. package/dist/reads/support/params.d.ts +50 -0
  400. package/dist/reads/support/params.d.ts.map +1 -0
  401. package/dist/reads/support/params.js +73 -0
  402. package/dist/reads/support/params.js.map +1 -0
  403. package/dist/reads/support/resolve.d.ts +17 -0
  404. package/dist/reads/support/resolve.d.ts.map +1 -0
  405. package/dist/reads/support/resolve.js +33 -0
  406. package/dist/reads/support/resolve.js.map +1 -0
  407. package/dist/reads/support/results.d.ts +22 -0
  408. package/dist/reads/support/results.d.ts.map +1 -0
  409. package/dist/reads/support/results.js +41 -0
  410. package/dist/reads/support/results.js.map +1 -0
  411. package/dist/reads/support/roles.d.ts +13 -0
  412. package/dist/reads/support/roles.d.ts.map +1 -0
  413. package/dist/reads/support/roles.js +27 -0
  414. package/dist/reads/support/roles.js.map +1 -0
  415. package/dist/reads/support/scans.d.ts +31 -0
  416. package/dist/reads/support/scans.d.ts.map +1 -0
  417. package/dist/reads/support/scans.js +66 -0
  418. package/dist/reads/support/scans.js.map +1 -0
  419. package/dist/reads/types.d.ts +48 -0
  420. package/dist/reads/types.d.ts.map +1 -0
  421. package/dist/reads/types.js +5 -0
  422. package/dist/reads/types.js.map +1 -0
  423. package/dist/reads/users.d.ts +4 -0
  424. package/dist/reads/users.d.ts.map +1 -0
  425. package/dist/reads/users.js +57 -0
  426. package/dist/reads/users.js.map +1 -0
  427. package/dist/testing/FakePatrolTechGateway.d.ts +212 -0
  428. package/dist/testing/FakePatrolTechGateway.d.ts.map +1 -0
  429. package/dist/testing/FakePatrolTechGateway.js +712 -0
  430. package/dist/testing/FakePatrolTechGateway.js.map +1 -0
  431. package/dist/testing/RecordingFileSink.d.ts +12 -0
  432. package/dist/testing/RecordingFileSink.d.ts.map +1 -0
  433. package/dist/testing/RecordingFileSink.js +12 -0
  434. package/dist/testing/RecordingFileSink.js.map +1 -0
  435. package/dist/testing/index.d.ts +4 -0
  436. package/dist/testing/index.d.ts.map +1 -0
  437. package/dist/testing/index.js +4 -0
  438. package/dist/testing/index.js.map +1 -0
  439. package/dist/testing/reads.d.ts +34 -0
  440. package/dist/testing/reads.d.ts.map +1 -0
  441. package/dist/testing/reads.js +39 -0
  442. package/dist/testing/reads.js.map +1 -0
  443. package/package.json +76 -4
@@ -0,0 +1,15 @@
1
+ import { type FixedTextLanguage } from './language.js';
2
+ /**
3
+ * Mensaje listo para que el administrador se lo reenvíe al vigilante (por
4
+ * WhatsApp o email): qué es, su enlace personal y cómo instalar o abrir la app.
5
+ * El bot no puede enviárselo al vigilante (el backend no tiene esa vía), así
6
+ * que se lo deja preparado al administrador.
7
+ *
8
+ * Solo hechos comprobados del producto: app «Patrol Tech Scan» en Google
9
+ * Play; con ella instalada el enlace abre la app con el vigilante ya elegido y
10
+ * basta pulsar «Iniciar Sesión»; en iPhone no hay app y se usa la web desde el
11
+ * navegador, añadida a la pantalla de inicio; permisos obligatorios Cámara,
12
+ * Ubicación y Notificaciones.
13
+ */
14
+ export declare function guardAppMessage(vigilante: string, enlace: string, idioma: FixedTextLanguage): string;
15
+ //# sourceMappingURL=guard-app-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard-app-message.d.ts","sourceRoot":"","sources":["../../src/domain/guard-app-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEpE;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,iBAAiB,GACxB,MAAM,CAwBR"}
@@ -0,0 +1,39 @@
1
+ import { segunIdioma } from './language.js';
2
+ /**
3
+ * Mensaje listo para que el administrador se lo reenvíe al vigilante (por
4
+ * WhatsApp o email): qué es, su enlace personal y cómo instalar o abrir la app.
5
+ * El bot no puede enviárselo al vigilante (el backend no tiene esa vía), así
6
+ * que se lo deja preparado al administrador.
7
+ *
8
+ * Solo hechos comprobados del producto: app «Patrol Tech Scan» en Google
9
+ * Play; con ella instalada el enlace abre la app con el vigilante ya elegido y
10
+ * basta pulsar «Iniciar Sesión»; en iPhone no hay app y se usa la web desde el
11
+ * navegador, añadida a la pantalla de inicio; permisos obligatorios Cámara,
12
+ * Ubicación y Notificaciones.
13
+ */
14
+ export function guardAppMessage(vigilante, enlace, idioma) {
15
+ return segunIdioma(idioma, {
16
+ es: [
17
+ `Hola ${vigilante}, te paso tu acceso a PatrolTech, la app con la que escanearás los puntos de control en tus rondas.`,
18
+ `Tu enlace personal (no lo compartas): ${enlace}`,
19
+ '- Android: instala «Patrol Tech Scan» desde Google Play y después abre el enlace: se abre la app con tu nombre ya elegido; solo tienes que pulsar «Iniciar Sesión».',
20
+ '- iPhone: no hay app en la App Store; abre el enlace en el navegador y añádelo a la pantalla de inicio desde el menú del navegador.',
21
+ 'Al entrar, concede los permisos de Cámara, Ubicación y Notificaciones.',
22
+ ],
23
+ en: [
24
+ `Hi ${vigilante}, this is your access to PatrolTech, the app you'll use to scan the checkpoints on your rounds.`,
25
+ `Your personal link (don't share it): ${enlace}`,
26
+ '- Android: install «Patrol Tech Scan» from Google Play, then open the link: it opens the app with your name already selected; just tap the sign-in button.',
27
+ "- iPhone: there's no App Store app; open the link in the browser and add it to your home screen from the browser menu.",
28
+ 'When you sign in, allow Camera, Location and Notifications.',
29
+ ],
30
+ fr: [
31
+ `Bonjour ${vigilante}, voici votre accès à PatrolTech, l'application avec laquelle vous scannerez les points de contrôle pendant vos rondes.`,
32
+ `Votre lien personnel (ne le partagez pas) : ${enlace}`,
33
+ "- Android : installez «Patrol Tech Scan» depuis Google Play, puis ouvrez le lien : l'application s'ouvre avec votre nom déjà sélectionné ; il suffit d'appuyer sur le bouton de connexion.",
34
+ "- iPhone : il n'y a pas d'application sur l'App Store ; ouvrez le lien dans le navigateur et ajoutez-le à l'écran d'accueil depuis le menu du navigateur.",
35
+ 'À la connexion, autorisez la Caméra, la Localisation et les Notifications.',
36
+ ],
37
+ }).join('\n');
38
+ }
39
+ //# sourceMappingURL=guard-app-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard-app-message.js","sourceRoot":"","sources":["../../src/domain/guard-app-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA0B,MAAM,eAAe,CAAC;AAEpE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,MAAc,EACd,MAAyB;IAEzB,OAAO,WAAW,CAAC,MAAM,EAAE;QACzB,EAAE,EAAE;YACF,QAAQ,SAAS,qGAAqG;YACtH,yCAAyC,MAAM,EAAE;YACjD,qKAAqK;YACrK,qIAAqI;YACrI,wEAAwE;SACzE;QACD,EAAE,EAAE;YACF,MAAM,SAAS,iGAAiG;YAChH,wCAAwC,MAAM,EAAE;YAChD,4JAA4J;YAC5J,wHAAwH;YACxH,6DAA6D;SAC9D;QACD,EAAE,EAAE;YACF,WAAW,SAAS,yHAAyH;YAC7I,+CAA+C,MAAM,EAAE;YACvD,4LAA4L;YAC5L,2JAA2J;YAC3J,4EAA4E;SAC7E;KACF,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Prioridades de una incidencia (códigos de la API) con su nombre en el panel y en los
3
+ * parámetros/campos en inglés del canal MCP. Interno: no se exporta desde el paquete.
4
+ */
5
+ export declare const INCIDENT_PRIORITIES: {
6
+ readonly LOW: {
7
+ readonly es: "Baja";
8
+ readonly en: "low";
9
+ };
10
+ readonly MEDIUM: {
11
+ readonly es: "Media";
12
+ readonly en: "medium";
13
+ };
14
+ readonly HIGH: {
15
+ readonly es: "Alta";
16
+ readonly en: "high";
17
+ };
18
+ readonly CRITICAL: {
19
+ readonly es: "Crítica";
20
+ readonly en: "critical";
21
+ };
22
+ };
23
+ /** El nombre en el panel de una prioridad, o el código tal cual si es otro. */
24
+ export declare function incidentPriorityLabel(code: string): string;
25
+ //# sourceMappingURL=incident-priority.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incident-priority.d.ts","sourceRoot":"","sources":["../../src/domain/incident-priority.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;CAK+B,CAAC;AAEhE,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Prioridades de una incidencia (códigos de la API) con su nombre en el panel y en los
3
+ * parámetros/campos en inglés del canal MCP. Interno: no se exporta desde el paquete.
4
+ */
5
+ export const INCIDENT_PRIORITIES = {
6
+ LOW: { es: 'Baja', en: 'low' },
7
+ MEDIUM: { es: 'Media', en: 'medium' },
8
+ HIGH: { es: 'Alta', en: 'high' },
9
+ CRITICAL: { es: 'Crítica', en: 'critical' },
10
+ };
11
+ /** El nombre en el panel de una prioridad, o el código tal cual si es otro. */
12
+ export function incidentPriorityLabel(code) {
13
+ return INCIDENT_PRIORITIES[code]?.es ?? code;
14
+ }
15
+ //# sourceMappingURL=incident-priority.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incident-priority.js","sourceRoot":"","sources":["../../src/domain/incident-priority.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,GAAG,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE;IAC9B,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE;IACrC,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE;IAChC,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE;CACkB,CAAC;AAEhE,+EAA+E;AAC/E,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAQ,mBAAkE,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC;AAC/F,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { FixedTextLanguage } from './language.js';
2
+ /**
3
+ * Estados y reglas de una incidencia, los mismos que aplica la API, para explicarle al
4
+ * cliente ANTES de proponer por qué un cambio no se puede hacer. El backend
5
+ * sigue siendo quien decide.
6
+ */
7
+ export declare const INCIDENT_STATUSES: readonly ["OPEN", "IN_PROGRESS", "RESOLVED", "DISCARDED", "CLOSED"];
8
+ export type IncidentStatus = (typeof INCIDENT_STATUSES)[number];
9
+ /** Nombres de los estados tal como salen en el panel (i18n `incidentReporting.status`). */
10
+ export declare const INCIDENT_STATUS_LABELS: Record<IncidentStatus, Record<FixedTextLanguage, string>>;
11
+ /** Cómo se nombra cada estado en los parámetros de las tools (en español, sin espacios). */
12
+ export declare const INCIDENT_STATUS_PARAM: {
13
+ readonly abierto: "OPEN";
14
+ readonly en_progreso: "IN_PROGRESS";
15
+ readonly resuelto: "RESOLVED";
16
+ readonly cerrado: "CLOSED";
17
+ readonly descartado: "DISCARDED";
18
+ };
19
+ export type IncidentStatusParam = keyof typeof INCIDENT_STATUS_PARAM;
20
+ export declare const INCIDENT_STATUS_PARAMS: [IncidentStatusParam, ...IncidentStatusParam[]];
21
+ /** `ALLOWED_TRANSITIONS` del backend. */
22
+ export declare const INCIDENT_TRANSITIONS: Record<IncidentStatus, readonly IncidentStatus[]>;
23
+ /** Resolver y descartar exigen comentario (`requiresComment`). */
24
+ export declare const INCIDENT_REQUIRES_COMMENT: readonly IncidentStatus[];
25
+ /** Pasar a En progreso exige que esté asignada (`requiresAssignment`). */
26
+ export declare const INCIDENT_REQUIRES_ASSIGNMENT: readonly IncidentStatus[];
27
+ /** Cerrado y Descartado son definitivos: después no se puede cambiar nada (`isIncidentLocked`). */
28
+ export declare const INCIDENT_FINAL: readonly IncidentStatus[];
29
+ //# sourceMappingURL=incident-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incident-status.d.ts","sourceRoot":"","sources":["../../src/domain/incident-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,qEAMpB,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,2FAA2F;AAC3F,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAM5F,CAAC;AAEF,4FAA4F;AAC5F,eAAO,MAAM,qBAAqB;;;;;;CAMiB,CAAC;AACpD,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,qBAAqB,CAAC;AACrE,eAAO,MAAM,sBAAsB,EAAyC,CAC1E,mBAAmB,EACnB,GAAG,mBAAmB,EAAE,CACzB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,cAAc,EAAE,SAAS,cAAc,EAAE,CAMlF,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,yBAAyB,EAAE,SAAS,cAAc,EAA8B,CAAC;AAE9F,0EAA0E;AAC1E,eAAO,MAAM,4BAA4B,EAAE,SAAS,cAAc,EAAoB,CAAC;AAEvF,mGAAmG;AACnG,eAAO,MAAM,cAAc,EAAE,SAAS,cAAc,EAA4B,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Estados y reglas de una incidencia, los mismos que aplica la API, para explicarle al
3
+ * cliente ANTES de proponer por qué un cambio no se puede hacer. El backend
4
+ * sigue siendo quien decide.
5
+ */
6
+ export const INCIDENT_STATUSES = [
7
+ 'OPEN',
8
+ 'IN_PROGRESS',
9
+ 'RESOLVED',
10
+ 'DISCARDED',
11
+ 'CLOSED',
12
+ ];
13
+ /** Nombres de los estados tal como salen en el panel (i18n `incidentReporting.status`). */
14
+ export const INCIDENT_STATUS_LABELS = {
15
+ OPEN: { es: 'Abierto', en: 'Open', fr: 'Ouvert' },
16
+ IN_PROGRESS: { es: 'En progreso', en: 'In Progress', fr: 'En cours' },
17
+ RESOLVED: { es: 'Resuelto', en: 'Resolved', fr: 'Résolu' },
18
+ CLOSED: { es: 'Cerrado', en: 'Closed', fr: 'Clôturé' },
19
+ DISCARDED: { es: 'Descartado', en: 'Discarded', fr: 'Rejeté' },
20
+ };
21
+ /** Cómo se nombra cada estado en los parámetros de las tools (en español, sin espacios). */
22
+ export const INCIDENT_STATUS_PARAM = {
23
+ abierto: 'OPEN',
24
+ en_progreso: 'IN_PROGRESS',
25
+ resuelto: 'RESOLVED',
26
+ cerrado: 'CLOSED',
27
+ descartado: 'DISCARDED',
28
+ };
29
+ export const INCIDENT_STATUS_PARAMS = Object.keys(INCIDENT_STATUS_PARAM);
30
+ /** `ALLOWED_TRANSITIONS` del backend. */
31
+ export const INCIDENT_TRANSITIONS = {
32
+ OPEN: ['IN_PROGRESS', 'DISCARDED'],
33
+ IN_PROGRESS: ['RESOLVED', 'OPEN', 'DISCARDED'],
34
+ RESOLVED: ['CLOSED', 'IN_PROGRESS'],
35
+ DISCARDED: [],
36
+ CLOSED: [],
37
+ };
38
+ /** Resolver y descartar exigen comentario (`requiresComment`). */
39
+ export const INCIDENT_REQUIRES_COMMENT = ['RESOLVED', 'DISCARDED'];
40
+ /** Pasar a En progreso exige que esté asignada (`requiresAssignment`). */
41
+ export const INCIDENT_REQUIRES_ASSIGNMENT = ['IN_PROGRESS'];
42
+ /** Cerrado y Descartado son definitivos: después no se puede cambiar nada (`isIncidentLocked`). */
43
+ export const INCIDENT_FINAL = ['CLOSED', 'DISCARDED'];
44
+ //# sourceMappingURL=incident-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incident-status.js","sourceRoot":"","sources":["../../src/domain/incident-status.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,MAAM;IACN,aAAa;IACb,UAAU;IACV,WAAW;IACX,QAAQ;CACA,CAAC;AAGX,2FAA2F;AAC3F,MAAM,CAAC,MAAM,sBAAsB,GAA8D;IAC/F,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE;IACjD,WAAW,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE;IACrE,QAAQ,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE;IAC1D,MAAM,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE;IACtD,SAAS,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE;CAC/D,CAAC;AAEF,4FAA4F;AAC5F,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,OAAO,EAAE,MAAM;IACf,WAAW,EAAE,aAAa;IAC1B,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,QAAQ;IACjB,UAAU,EAAE,WAAW;CAC0B,CAAC;AAEpD,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAGtE,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,oBAAoB,GAAsD;IACrF,IAAI,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC;IAClC,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC;IAC9C,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;IACnC,SAAS,EAAE,EAAE;IACb,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,kEAAkE;AAClE,MAAM,CAAC,MAAM,yBAAyB,GAA8B,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AAE9F,0EAA0E;AAC1E,MAAM,CAAC,MAAM,4BAA4B,GAA8B,CAAC,aAAa,CAAC,CAAC;AAEvF,mGAAmG;AACnG,MAAM,CAAC,MAAM,cAAc,GAA8B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Idioma BASE de un locale (`es_MX` → `es`, `en-US` → `en`).
3
+ *
4
+ * Hay canales que solo tienen textos por idioma base: se normaliza al guardar el
5
+ * idioma del contacto y al usarlo, para que el que se guarda y el que se usa sean
6
+ * el mismo.
7
+ */
8
+ export declare function baseLanguage(language: string): string;
9
+ export type ReplyLanguage = 'es' | 'en' | 'fr';
10
+ /**
11
+ * Idioma de un texto del cliente, o `null` si es demasiado corto o no hay un
12
+ * ganador claro («Hi», «ok», «👍», un número, «de la»).
13
+ *
14
+ * Heurística por palabras funcionales + caracteres propios, sin
15
+ * dependencias. Techo: solo es/en/fr; frases de 1 palabra o de puro vocabulario
16
+ * técnico no deciden; textos mezclados deciden por mayoría simple; otros idiomas
17
+ * romances (pt, it, ca) pueden leerse como es/fr. Si hace falta más, un detector
18
+ * de n-gramas (franc/cld3) o preguntar a un modelo.
19
+ */
20
+ export declare function detectLanguage(text: string): ReplyLanguage | null;
21
+ /**
22
+ * Idioma en que debe ir la respuesta del bot: el del último mensaje del cliente;
23
+ * si ese no decide, el de sus últimos 3 mensajes juntos; si tampoco, el idioma
24
+ * (base) guardado del contacto; y, en último caso, español.
25
+ */
26
+ export declare function resolveReplyLanguage(customerMessages: readonly string[], contactLanguage: string | null): ReplyLanguage;
27
+ /**
28
+ * Idioma de los textos FIJOS del bot (los que no escribe el modelo: confirmación
29
+ * de una acción, errores del backend…). Hay versión en los tres idiomas de
30
+ * respuesta, así que es el mismo idioma en que contesta el modelo.
31
+ */
32
+ export type FixedTextLanguage = ReplyLanguage;
33
+ export declare function fixedTextLanguage(language: ReplyLanguage): FixedTextLanguage;
34
+ /**
35
+ * El texto del idioma pedido. Con un `Record` el compilador exige los tres: un
36
+ * idioma nuevo no cae en silencio al de otro (lo que pasaba con `idioma === 'en' ? … : …`).
37
+ */
38
+ export declare function segunIdioma<T>(idioma: FixedTextLanguage, textos: Record<FixedTextLanguage, T>): T;
39
+ //# sourceMappingURL=language.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../../src/domain/language.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AA+D/C;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAejE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,gBAAgB,EAAE,SAAS,MAAM,EAAE,EACnC,eAAe,EAAE,MAAM,GAAG,IAAI,GAC7B,aAAa,CAQf;AAED;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAE9C,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,iBAAiB,CAE5E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,GAAG,CAAC,CAEjG"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Idioma BASE de un locale (`es_MX` → `es`, `en-US` → `en`).
3
+ *
4
+ * Hay canales que solo tienen textos por idioma base: se normaliza al guardar el
5
+ * idioma del contacto y al usarlo, para que el que se guarda y el que se usa sean
6
+ * el mismo.
7
+ */
8
+ export function baseLanguage(language) {
9
+ return language.split(/[-_]/)[0].toLowerCase();
10
+ }
11
+ const SUPPORTED = ['es', 'en', 'fr'];
12
+ // Palabras funcionales frecuentes y fórmulas de cortesía. Las que comparten dos
13
+ // idiomas ("de", "la", "que", "no") puntúan en ambos y no deshacen empates.
14
+ // "a" se deja fuera: es artículo en inglés, preposición en español y verbo en francés.
15
+ const FUNCTION_WORDS = {
16
+ es: new Set(('el la los las un una unos unas de del al y o que en con por para sin sobre es son está están estoy estás hay ha he ' +
17
+ 'tengo tiene tienes puedo puede quiero no sí yo tú usted mi mis tu su sus me te se nos le lo les este esta esto ese ' +
18
+ 'esa eso pero como cómo qué cuál cuando cuándo donde dónde muy más también ya hola gracias buenos buenas días tardes ' +
19
+ 'noches vale perdón disculpa favor ayuda bien funciona').split(' ')),
20
+ en: new Set(("the an and or of to in on at for with from by about is are was were be been am have has had do does did don't " +
21
+ "can can't cannot will would should could i i'm you your you're he she it it's we they my our their this that these " +
22
+ 'those what which when where how why not no yes just but so if there here hi hello hey thanks thank please sorry ' +
23
+ 'good morning way need help').split(' ')),
24
+ fr: new Set(('le la les un une des du de et ou que qui en dans avec pour par sur sans est sont suis êtes avons avez ai je tu il ' +
25
+ 'elle nous vous ils elles mon ma mes ton ta votre vos notre ce cette ces mais pas ne oui non très aussi bonjour ' +
26
+ "bonsoir salut merci beaucoup plaît désolé comment pourquoi quand où c'est j'ai ça marche").split(' ')),
27
+ };
28
+ // Caracteres que delatan el idioma (una sola vez por texto, no por aparición).
29
+ const CHAR_SIGNALS = {
30
+ es: /[ñ¿¡áíóú]/,
31
+ fr: /[çàèêœâîôûùëï]/,
32
+ };
33
+ const CHAR_SIGNAL_WEIGHT = 2;
34
+ // Saludos que solo existen en un idioma: bastan solos para decidir («Hi» → inglés). Sin esto, un
35
+ // «Hi» no llegaba al mínimo y ganaba el idioma guardado del contacto.
36
+ const GREETINGS = {
37
+ es: new Set(['hola', 'buenas']),
38
+ en: new Set(['hi', 'hello', 'hey']),
39
+ fr: new Set(['bonjour', 'bonsoir', 'salut']),
40
+ };
41
+ /** Puntos mínimos para decidir: con menos, el texto no dice nada fiable («ok», «Gracias»). */
42
+ const MIN_SCORE = 2;
43
+ /**
44
+ * Quita lo que el SISTEMA escribe en español dentro de un mensaje del cliente
45
+ * (marcas de adjunto y la descripción de una imagen), que si no arrastraría la
46
+ * detección al español. La transcripción de un audio sí son palabras del
47
+ * cliente: se queda, sin su etiqueta.
48
+ */
49
+ function customerWords(text) {
50
+ return text
51
+ .replace(/Contenido de la imagen:[\s\S]*?(?:<<\/adjunto_del_cliente>>|$)/g, ' ')
52
+ .replace(/Transcripción del audio:/g, ' ')
53
+ .replace(/<<\/?adjunto_del_cliente>>/g, ' ')
54
+ .replace(/\[El usuario ha (?:enviado|compartido)[^\]]*\]/g, ' ');
55
+ }
56
+ /**
57
+ * Idioma de un texto del cliente, o `null` si es demasiado corto o no hay un
58
+ * ganador claro («Hi», «ok», «👍», un número, «de la»).
59
+ *
60
+ * Heurística por palabras funcionales + caracteres propios, sin
61
+ * dependencias. Techo: solo es/en/fr; frases de 1 palabra o de puro vocabulario
62
+ * técnico no deciden; textos mezclados deciden por mayoría simple; otros idiomas
63
+ * romances (pt, it, ca) pueden leerse como es/fr. Si hace falta más, un detector
64
+ * de n-gramas (franc/cld3) o preguntar a un modelo.
65
+ */
66
+ export function detectLanguage(text) {
67
+ const clean = customerWords(text).toLowerCase().replace(/[’`]/g, "'");
68
+ const scores = { es: 0, en: 0, fr: 0 };
69
+ for (const word of clean.match(/\p{L}+(?:'\p{L}+)*/gu) ?? []) {
70
+ for (const lang of SUPPORTED) {
71
+ if (GREETINGS[lang].has(word))
72
+ scores[lang] += MIN_SCORE;
73
+ else if (FUNCTION_WORDS[lang].has(word))
74
+ scores[lang] += 1;
75
+ }
76
+ }
77
+ if (CHAR_SIGNALS.es.test(clean))
78
+ scores.es += CHAR_SIGNAL_WEIGHT;
79
+ if (CHAR_SIGNALS.fr.test(clean))
80
+ scores.fr += CHAR_SIGNAL_WEIGHT;
81
+ const [first, second] = [...SUPPORTED].sort((a, b) => scores[b] - scores[a]);
82
+ if (scores[first] < MIN_SCORE || scores[first] === scores[second])
83
+ return null;
84
+ return first;
85
+ }
86
+ /**
87
+ * Idioma en que debe ir la respuesta del bot: el del último mensaje del cliente;
88
+ * si ese no decide, el de sus últimos 3 mensajes juntos; si tampoco, el idioma
89
+ * (base) guardado del contacto; y, en último caso, español.
90
+ */
91
+ export function resolveReplyLanguage(customerMessages, contactLanguage) {
92
+ const last = customerMessages.at(-1);
93
+ const fromLast = last === undefined ? null : detectLanguage(last);
94
+ if (fromLast)
95
+ return fromLast;
96
+ const fromRecent = detectLanguage(customerMessages.slice(-3).join('\n'));
97
+ if (fromRecent)
98
+ return fromRecent;
99
+ const contact = contactLanguage ? baseLanguage(contactLanguage) : null;
100
+ return SUPPORTED.find((l) => l === contact) ?? 'es';
101
+ }
102
+ export function fixedTextLanguage(language) {
103
+ return language;
104
+ }
105
+ /**
106
+ * El texto del idioma pedido. Con un `Record` el compilador exige los tres: un
107
+ * idioma nuevo no cae en silencio al de otro (lo que pasaba con `idioma === 'en' ? … : …`).
108
+ */
109
+ export function segunIdioma(idioma, textos) {
110
+ return textos[idioma];
111
+ }
112
+ //# sourceMappingURL=language.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language.js","sourceRoot":"","sources":["../../src/domain/language.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** «11 €», «250 US$» (con espacio normal: Intl pone uno duro). */
2
+ export declare function importe(valor: number, moneda: string): string;
3
+ //# sourceMappingURL=money.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"money.d.ts","sourceRoot":"","sources":["../../src/domain/money.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAS7D"}
@@ -0,0 +1,12 @@
1
+ /** «11 €», «250 US$» (con espacio normal: Intl pone uno duro). */
2
+ export function importe(valor, moneda) {
3
+ return new Intl.NumberFormat('es-ES', {
4
+ style: 'currency',
5
+ currency: moneda,
6
+ minimumFractionDigits: 0,
7
+ maximumFractionDigits: 2,
8
+ })
9
+ .format(valor)
10
+ .replace(/\u00a0/g, ' ');
11
+ }
12
+ //# sourceMappingURL=money.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"money.js","sourceRoot":"","sources":["../../src/domain/money.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,MAAc;IACnD,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;QACpC,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,MAAM;QAChB,qBAAqB,EAAE,CAAC;QACxB,qBAAqB,EAAE,CAAC;KACzB,CAAC;SACC,MAAM,CAAC,KAAK,CAAC;SACb,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Las cuatro lecturas del backend que hacen falta para saber en qué punto de la
3
+ * puesta en marcha está una organización. Es un puerto mínimo: cualquier cliente
4
+ * del backend que las ofrezca (el `PatrolTechClient` del bot, el gateway) lo cumple.
5
+ */
6
+ export interface PuestaEnMarchaSource {
7
+ getSupportSummary(orgId: string, token: string): Promise<{
8
+ checkpoints: {
9
+ total: number;
10
+ };
11
+ patrollers: {
12
+ total: number;
13
+ };
14
+ }>;
15
+ listPatrollers(orgId: string, token: string): Promise<{
16
+ items: {
17
+ lastScanAt: string | null;
18
+ }[];
19
+ }>;
20
+ listRoutes(orgId: string, token: string): Promise<{
21
+ items: unknown[];
22
+ }>;
23
+ getRecentScans(orgId: string, token: string, opts: {
24
+ limit: number;
25
+ }): Promise<{
26
+ items: {
27
+ timestamp: string;
28
+ }[];
29
+ }>;
30
+ }
31
+ /** Hitos de la puesta en marcha de una organización, tal como los da el backend. */
32
+ export interface PuestaEnMarcha {
33
+ checkpointsCreados: number;
34
+ vigilantes: number;
35
+ /** Vigilantes con algún escaneo: señal de que ya usan la app. */
36
+ vigilantesConAlgunEscaneo: number;
37
+ hayEscaneos: boolean;
38
+ ultimoEscaneo: string | null;
39
+ rutasCreadas: number;
40
+ }
41
+ /**
42
+ * Consulta al backend en qué punto de la puesta en marcha está la organización.
43
+ * La usan `consultar_puesta_en_marcha`, el siguiente paso tras cada acción y el
44
+ * nudge: los tres deciden con el mismo estado real. Lanza si el backend falla.
45
+ */
46
+ export declare function leerPuestaEnMarcha(patrolTech: PuestaEnMarchaSource, orgId: string, token: string): Promise<PuestaEnMarcha>;
47
+ //# sourceMappingURL=puesta-en-marcha.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puesta-en-marcha.d.ts","sourceRoot":"","sources":["../../src/domain/puesta-en-marcha.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,CACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,WAAW,EAAE;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,UAAU,EAAE;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;IAC9E,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE;YAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC,CAAC;IAClG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CAAC;IACxE,cAAc,CACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GACtB,OAAO,CAAC;QAAE,KAAK,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC,CAAC;CAChD;AAED,oFAAoF;AACpF,MAAM,WAAW,cAAc;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,yBAAyB,EAAE,MAAM,CAAC;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,oBAAoB,EAChC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAezB"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Consulta al backend en qué punto de la puesta en marcha está la organización.
3
+ * La usan `consultar_puesta_en_marcha`, el siguiente paso tras cada acción y el
4
+ * nudge: los tres deciden con el mismo estado real. Lanza si el backend falla.
5
+ */
6
+ export async function leerPuestaEnMarcha(patrolTech, orgId, token) {
7
+ const [resumen, vigilantes, rutas, escaneos] = await Promise.all([
8
+ patrolTech.getSupportSummary(orgId, token),
9
+ patrolTech.listPatrollers(orgId, token),
10
+ patrolTech.listRoutes(orgId, token),
11
+ patrolTech.getRecentScans(orgId, token, { limit: 1 }),
12
+ ]);
13
+ return {
14
+ checkpointsCreados: resumen.checkpoints.total,
15
+ vigilantes: resumen.patrollers.total,
16
+ vigilantesConAlgunEscaneo: vigilantes.items.filter((p) => p.lastScanAt).length,
17
+ hayEscaneos: escaneos.items.length > 0,
18
+ ultimoEscaneo: escaneos.items[0]?.timestamp ?? null,
19
+ rutasCreadas: rutas.items.length,
20
+ };
21
+ }
22
+ //# sourceMappingURL=puesta-en-marcha.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puesta-en-marcha.js","sourceRoot":"","sources":["../../src/domain/puesta-en-marcha.ts"],"names":[],"mappings":"AA8BA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAgC,EAChC,KAAa,EACb,KAAa;IAEb,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/D,UAAU,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;QAC1C,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC;QACvC,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC;QACnC,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;KACtD,CAAC,CAAC;IACH,OAAO;QACL,kBAAkB,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK;QAC7C,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,KAAK;QACpC,yBAAyB,EAAE,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM;QAC9E,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QACtC,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,IAAI;QACnD,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;KACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Lado del PNG en píxeles: a 300 ppp son ~8,5 cm, de sobra para imprimir y
3
+ * pegar el QR junto al punto de control sin que se pixele.
4
+ */
5
+ export declare const QR_IMAGE_SIZE_PX = 1024;
6
+ export interface QrImage {
7
+ png: Buffer;
8
+ /** Pie para el mensaje: nombre del checkpoint y el código tal cual va en el QR. */
9
+ caption: string;
10
+ }
11
+ /**
12
+ * Imagen del QR de un checkpoint (el texto `PT-XXXXXXXXXX` o una URL) lista para
13
+ * imprimir, con el pie que la acompaña en el mensaje.
14
+ *
15
+ * `qrcode` sin canvas solo pinta el QR; escribir el nombre y el
16
+ * código al pie DENTRO del PNG exigiría una dependencia nativa (canvas) o una
17
+ * fuente de mapa de bits propia. El nombre y el código van en el `caption` del
18
+ * mensaje; si hace falta en la propia imagen, se compone aquí sin cambiar a
19
+ * los llamadores.
20
+ */
21
+ export declare function checkpointQrImage(input: {
22
+ code: string;
23
+ name: string;
24
+ }): Promise<QrImage>;
25
+ //# sourceMappingURL=qr-image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr-image.d.ts","sourceRoot":"","sources":["../../src/domain/qr-image.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAU/F"}
@@ -0,0 +1,28 @@
1
+ import { toBuffer } from 'qrcode';
2
+ /**
3
+ * Lado del PNG en píxeles: a 300 ppp son ~8,5 cm, de sobra para imprimir y
4
+ * pegar el QR junto al punto de control sin que se pixele.
5
+ */
6
+ export const QR_IMAGE_SIZE_PX = 1024;
7
+ /**
8
+ * Imagen del QR de un checkpoint (el texto `PT-XXXXXXXXXX` o una URL) lista para
9
+ * imprimir, con el pie que la acompaña en el mensaje.
10
+ *
11
+ * `qrcode` sin canvas solo pinta el QR; escribir el nombre y el
12
+ * código al pie DENTRO del PNG exigiría una dependencia nativa (canvas) o una
13
+ * fuente de mapa de bits propia. El nombre y el código van en el `caption` del
14
+ * mensaje; si hace falta en la propia imagen, se compone aquí sin cambiar a
15
+ * los llamadores.
16
+ */
17
+ export async function checkpointQrImage(input) {
18
+ const png = await toBuffer(input.code, {
19
+ type: 'png',
20
+ width: QR_IMAGE_SIZE_PX,
21
+ // Margen de 4 módulos: el mínimo que pide el estándar para que lea bien impreso.
22
+ margin: 4,
23
+ // M (~15 % recuperable): aguanta una pegatina algo rayada sin engordar el QR.
24
+ errorCorrectionLevel: 'M',
25
+ });
26
+ return { png, caption: `${input.name}\n${input.code}` };
27
+ }
28
+ //# sourceMappingURL=qr-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr-image.js","sourceRoot":"","sources":["../../src/domain/qr-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAQrC;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAqC;IAC3E,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;QACrC,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,gBAAgB;QACvB,iFAAiF;QACjF,MAAM,EAAE,CAAC;QACT,8EAA8E;QAC9E,oBAAoB,EAAE,GAAG;KAC1B,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Forma comparable de un nombre: sin tildes, sin mayúsculas y con los espacios
3
+ * colapsados. Por WhatsApp escriben «almacen norte» para «Almacén Norte».
4
+ */
5
+ export declare function normalizeName(s: string): string;
6
+ /**
7
+ * Resolución de un nombre dicho por el usuario (organización, vigilante, ruta)
8
+ * contra la lista de elementos a los que tiene acceso.
9
+ *
10
+ * Reglas, en este orden: cadena vacía = NO resuelto; coincidencia exacta del
11
+ * nombre (sin distinguir mayúsculas, tildes ni espacios repetidos: `normalizeName`);
12
+ * identificador exacto (cuando el llamador sabe mapearlo, p. ej. el id que
13
+ * devuelve un botón de WhatsApp); índice numérico
14
+ * 1-based ("2"); y por último substring. Un substring que casa con más de un
15
+ * elemento es AMBIGUO y se devuelve como tal: coger el primero en silencio hacía
16
+ * que "Vigilancia" con Madrid y Barcelona respondiera con los datos de Madrid
17
+ * sin que nadie se enterase.
18
+ */
19
+ export type NameMatch<T> = {
20
+ kind: 'found';
21
+ item: T;
22
+ } | {
23
+ kind: 'none';
24
+ } | {
25
+ kind: 'ambiguous';
26
+ matches: T[];
27
+ };
28
+ export declare function resolveByName<T>(input: string, items: readonly T[], nameOf: (item: T) => string, opts?: {
29
+ byIndex?: boolean;
30
+ idOf?: (item: T) => string;
31
+ }): NameMatch<T>;
32
+ //# sourceMappingURL=resolve-by-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-by-name.d.ts","sourceRoot":"","sources":["../../src/domain/resolve-by-name.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,CAAC,EAAE,CAAA;CAAE,CAAC;AAEtF,wBAAgB,aAAa,CAAC,CAAC,EAC7B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC3B,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAA;CAAO,GAC3D,SAAS,CAAC,CAAC,CAAC,CA4Bd"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Forma comparable de un nombre: sin tildes, sin mayúsculas y con los espacios
3
+ * colapsados. Por WhatsApp escriben «almacen norte» para «Almacén Norte».
4
+ */
5
+ export function normalizeName(s) {
6
+ return s.normalize('NFD').replace(/\p{M}/gu, '').toLowerCase().replace(/\s+/g, ' ').trim();
7
+ }
8
+ export function resolveByName(input, items, nameOf, opts = {}) {
9
+ const trimmed = input.trim();
10
+ // Vacío no resuelve: `''.includes('')` es true y devolvía SIEMPRE el primero.
11
+ if (!trimmed)
12
+ return { kind: 'none' };
13
+ const lower = normalizeName(trimmed);
14
+ const nombre = (item) => normalizeName(nameOf(item));
15
+ const exact = items.filter((item) => nombre(item) === lower);
16
+ if (exact.length === 1)
17
+ return { kind: 'found', item: exact[0] };
18
+ if (exact.length > 1)
19
+ return { kind: 'ambiguous', matches: exact };
20
+ if (opts.idOf) {
21
+ const byId = items.filter((item) => opts.idOf(item).toLowerCase() === trimmed.toLowerCase());
22
+ if (byId.length === 1)
23
+ return { kind: 'found', item: byId[0] };
24
+ }
25
+ // El índice va DESPUÉS del nombre exacto: una organización llamada "2" era
26
+ // inalcanzable por su nombre mientras hubiera dos o más (M2). Un índice fuera
27
+ // de rango NO corta la resolución: "2024" puede ser parte de un nombre.
28
+ if (opts.byIndex && /^\d+$/.test(trimmed)) {
29
+ const idx = Number(trimmed) - 1;
30
+ if (idx >= 0 && idx < items.length)
31
+ return { kind: 'found', item: items[idx] };
32
+ }
33
+ const contains = items.filter((item) => nombre(item).includes(lower));
34
+ if (contains.length === 1)
35
+ return { kind: 'found', item: contains[0] };
36
+ if (contains.length > 1)
37
+ return { kind: 'ambiguous', matches: contains };
38
+ return { kind: 'none' };
39
+ }
40
+ //# sourceMappingURL=resolve-by-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-by-name.js","sourceRoot":"","sources":["../../src/domain/resolve-by-name.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7F,CAAC;AAkBD,MAAM,UAAU,aAAa,CAC3B,KAAa,EACb,KAAmB,EACnB,MAA2B,EAC3B,OAA0D,EAAE;IAE5D,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,8EAA8E;IAC9E,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,CAAC,IAAO,EAAU,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;IAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAEnE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9F,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,CAAC;IAED,2EAA2E;IAC3E,8EAA8E;IAC9E,wEAAwE;IACxE,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM;YAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACjF,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACzE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC"}