@patroltech/agent-capabilities 0.0.0-stage → 0.2.0

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 (439) 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 +14 -0
  112. package/dist/catalog/english.d.ts.map +1 -0
  113. package/dist/catalog/english.js +368 -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-status.d.ts +29 -0
  156. package/dist/domain/incident-status.d.ts.map +1 -0
  157. package/dist/domain/incident-status.js +44 -0
  158. package/dist/domain/incident-status.js.map +1 -0
  159. package/dist/domain/language.d.ts +39 -0
  160. package/dist/domain/language.d.ts.map +1 -0
  161. package/dist/domain/language.js +112 -0
  162. package/dist/domain/language.js.map +1 -0
  163. package/dist/domain/money.d.ts +3 -0
  164. package/dist/domain/money.d.ts.map +1 -0
  165. package/dist/domain/money.js +12 -0
  166. package/dist/domain/money.js.map +1 -0
  167. package/dist/domain/puesta-en-marcha.d.ts +47 -0
  168. package/dist/domain/puesta-en-marcha.d.ts.map +1 -0
  169. package/dist/domain/puesta-en-marcha.js +22 -0
  170. package/dist/domain/puesta-en-marcha.js.map +1 -0
  171. package/dist/domain/qr-image.d.ts +25 -0
  172. package/dist/domain/qr-image.d.ts.map +1 -0
  173. package/dist/domain/qr-image.js +28 -0
  174. package/dist/domain/qr-image.js.map +1 -0
  175. package/dist/domain/resolve-by-name.d.ts +32 -0
  176. package/dist/domain/resolve-by-name.d.ts.map +1 -0
  177. package/dist/domain/resolve-by-name.js +40 -0
  178. package/dist/domain/resolve-by-name.js.map +1 -0
  179. package/dist/domain/route-checkpoints.d.ts +31 -0
  180. package/dist/domain/route-checkpoints.d.ts.map +1 -0
  181. package/dist/domain/route-checkpoints.js +27 -0
  182. package/dist/domain/route-checkpoints.js.map +1 -0
  183. package/dist/domain/route-schedule.d.ts +88 -0
  184. package/dist/domain/route-schedule.d.ts.map +1 -0
  185. package/dist/domain/route-schedule.js +203 -0
  186. package/dist/domain/route-schedule.js.map +1 -0
  187. package/dist/domain/scan-explanation.d.ts +25 -0
  188. package/dist/domain/scan-explanation.d.ts.map +1 -0
  189. package/dist/domain/scan-explanation.js +99 -0
  190. package/dist/domain/scan-explanation.js.map +1 -0
  191. package/dist/domain/scans-csv.d.ts +37 -0
  192. package/dist/domain/scans-csv.d.ts.map +1 -0
  193. package/dist/domain/scans-csv.js +67 -0
  194. package/dist/domain/scans-csv.js.map +1 -0
  195. package/dist/domain/timezone.d.ts +61 -0
  196. package/dist/domain/timezone.d.ts.map +1 -0
  197. package/dist/domain/timezone.js +113 -0
  198. package/dist/domain/timezone.js.map +1 -0
  199. package/dist/domain/tool-result.d.ts +55 -0
  200. package/dist/domain/tool-result.d.ts.map +1 -0
  201. package/dist/domain/tool-result.js +47 -0
  202. package/dist/domain/tool-result.js.map +1 -0
  203. package/dist/domain/urls.d.ts +33 -0
  204. package/dist/domain/urls.d.ts.map +1 -0
  205. package/dist/domain/urls.js +20 -0
  206. package/dist/domain/urls.js.map +1 -0
  207. package/dist/gateway/PatrolTechGateway.d.ts +195 -0
  208. package/dist/gateway/PatrolTechGateway.d.ts.map +1 -0
  209. package/dist/gateway/PatrolTechGateway.js +2 -0
  210. package/dist/gateway/PatrolTechGateway.js.map +1 -0
  211. package/dist/gateway/index.d.ts +4 -0
  212. package/dist/gateway/index.d.ts.map +1 -0
  213. package/dist/gateway/index.js +4 -0
  214. package/dist/gateway/index.js.map +1 -0
  215. package/dist/gateway/sdk/SdkPatrolTechGateway.d.ts +145 -0
  216. package/dist/gateway/sdk/SdkPatrolTechGateway.d.ts.map +1 -0
  217. package/dist/gateway/sdk/SdkPatrolTechGateway.js +101 -0
  218. package/dist/gateway/sdk/SdkPatrolTechGateway.js.map +1 -0
  219. package/dist/gateway/sdk/access.d.ts +8 -0
  220. package/dist/gateway/sdk/access.d.ts.map +1 -0
  221. package/dist/gateway/sdk/access.js +39 -0
  222. package/dist/gateway/sdk/access.js.map +1 -0
  223. package/dist/gateway/sdk/billing.d.ts +7 -0
  224. package/dist/gateway/sdk/billing.d.ts.map +1 -0
  225. package/dist/gateway/sdk/billing.js +92 -0
  226. package/dist/gateway/sdk/billing.js.map +1 -0
  227. package/dist/gateway/sdk/checkpoint-mappers.d.ts +23 -0
  228. package/dist/gateway/sdk/checkpoint-mappers.d.ts.map +1 -0
  229. package/dist/gateway/sdk/checkpoint-mappers.js +59 -0
  230. package/dist/gateway/sdk/checkpoint-mappers.js.map +1 -0
  231. package/dist/gateway/sdk/checkpoints.d.ts +33 -0
  232. package/dist/gateway/sdk/checkpoints.d.ts.map +1 -0
  233. package/dist/gateway/sdk/checkpoints.js +163 -0
  234. package/dist/gateway/sdk/checkpoints.js.map +1 -0
  235. package/dist/gateway/sdk/errors.d.ts +10 -0
  236. package/dist/gateway/sdk/errors.d.ts.map +1 -0
  237. package/dist/gateway/sdk/errors.js +46 -0
  238. package/dist/gateway/sdk/errors.js.map +1 -0
  239. package/dist/gateway/sdk/incidents.d.ts +18 -0
  240. package/dist/gateway/sdk/incidents.d.ts.map +1 -0
  241. package/dist/gateway/sdk/incidents.js +98 -0
  242. package/dist/gateway/sdk/incidents.js.map +1 -0
  243. package/dist/gateway/sdk/index.d.ts +4 -0
  244. package/dist/gateway/sdk/index.d.ts.map +1 -0
  245. package/dist/gateway/sdk/index.js +4 -0
  246. package/dist/gateway/sdk/index.js.map +1 -0
  247. package/dist/gateway/sdk/list.d.ts +15 -0
  248. package/dist/gateway/sdk/list.d.ts.map +1 -0
  249. package/dist/gateway/sdk/list.js +12 -0
  250. package/dist/gateway/sdk/list.js.map +1 -0
  251. package/dist/gateway/sdk/locations.d.ts +24 -0
  252. package/dist/gateway/sdk/locations.d.ts.map +1 -0
  253. package/dist/gateway/sdk/locations.js +44 -0
  254. package/dist/gateway/sdk/locations.js.map +1 -0
  255. package/dist/gateway/sdk/patrollers.d.ts +26 -0
  256. package/dist/gateway/sdk/patrollers.d.ts.map +1 -0
  257. package/dist/gateway/sdk/patrollers.js +132 -0
  258. package/dist/gateway/sdk/patrollers.js.map +1 -0
  259. package/dist/gateway/sdk/rounds.d.ts +15 -0
  260. package/dist/gateway/sdk/rounds.d.ts.map +1 -0
  261. package/dist/gateway/sdk/rounds.js +142 -0
  262. package/dist/gateway/sdk/rounds.js.map +1 -0
  263. package/dist/gateway/sdk/routes.d.ts +18 -0
  264. package/dist/gateway/sdk/routes.d.ts.map +1 -0
  265. package/dist/gateway/sdk/routes.js +74 -0
  266. package/dist/gateway/sdk/routes.js.map +1 -0
  267. package/dist/gateway/sdk/scans.d.ts +4 -0
  268. package/dist/gateway/sdk/scans.d.ts.map +1 -0
  269. package/dist/gateway/sdk/scans.js +72 -0
  270. package/dist/gateway/sdk/scans.js.map +1 -0
  271. package/dist/gateway/sdk/transport.d.ts +77 -0
  272. package/dist/gateway/sdk/transport.d.ts.map +1 -0
  273. package/dist/gateway/sdk/transport.js +81 -0
  274. package/dist/gateway/sdk/transport.js.map +1 -0
  275. package/dist/gateway/sdk/users.d.ts +15 -0
  276. package/dist/gateway/sdk/users.d.ts.map +1 -0
  277. package/dist/gateway/sdk/users.js +49 -0
  278. package/dist/gateway/sdk/users.js.map +1 -0
  279. package/dist/gateway/types/access.d.ts +32 -0
  280. package/dist/gateway/types/access.d.ts.map +1 -0
  281. package/dist/gateway/types/access.js +2 -0
  282. package/dist/gateway/types/access.js.map +1 -0
  283. package/dist/gateway/types/billing.d.ts +60 -0
  284. package/dist/gateway/types/billing.d.ts.map +1 -0
  285. package/dist/gateway/types/billing.js +2 -0
  286. package/dist/gateway/types/billing.js.map +1 -0
  287. package/dist/gateway/types/checkpoints.d.ts +84 -0
  288. package/dist/gateway/types/checkpoints.d.ts.map +1 -0
  289. package/dist/gateway/types/checkpoints.js +2 -0
  290. package/dist/gateway/types/checkpoints.js.map +1 -0
  291. package/dist/gateway/types/common.d.ts +13 -0
  292. package/dist/gateway/types/common.d.ts.map +1 -0
  293. package/dist/gateway/types/common.js +2 -0
  294. package/dist/gateway/types/common.js.map +1 -0
  295. package/dist/gateway/types/incidents.d.ts +53 -0
  296. package/dist/gateway/types/incidents.d.ts.map +1 -0
  297. package/dist/gateway/types/incidents.js +2 -0
  298. package/dist/gateway/types/incidents.js.map +1 -0
  299. package/dist/gateway/types/index.d.ts +12 -0
  300. package/dist/gateway/types/index.d.ts.map +1 -0
  301. package/dist/gateway/types/index.js +12 -0
  302. package/dist/gateway/types/index.js.map +1 -0
  303. package/dist/gateway/types/locations.d.ts +7 -0
  304. package/dist/gateway/types/locations.d.ts.map +1 -0
  305. package/dist/gateway/types/locations.js +2 -0
  306. package/dist/gateway/types/locations.js.map +1 -0
  307. package/dist/gateway/types/patrollers.d.ts +68 -0
  308. package/dist/gateway/types/patrollers.d.ts.map +1 -0
  309. package/dist/gateway/types/patrollers.js +15 -0
  310. package/dist/gateway/types/patrollers.js.map +1 -0
  311. package/dist/gateway/types/rounds.d.ts +89 -0
  312. package/dist/gateway/types/rounds.d.ts.map +1 -0
  313. package/dist/gateway/types/rounds.js +2 -0
  314. package/dist/gateway/types/rounds.js.map +1 -0
  315. package/dist/gateway/types/routes.d.ts +48 -0
  316. package/dist/gateway/types/routes.d.ts.map +1 -0
  317. package/dist/gateway/types/routes.js +2 -0
  318. package/dist/gateway/types/routes.js.map +1 -0
  319. package/dist/gateway/types/scans.d.ts +44 -0
  320. package/dist/gateway/types/scans.d.ts.map +1 -0
  321. package/dist/gateway/types/scans.js +2 -0
  322. package/dist/gateway/types/scans.js.map +1 -0
  323. package/dist/gateway/types/users.d.ts +32 -0
  324. package/dist/gateway/types/users.d.ts.map +1 -0
  325. package/dist/gateway/types/users.js +2 -0
  326. package/dist/gateway/types/users.js.map +1 -0
  327. package/dist/index.d.ts +32 -0
  328. package/dist/index.d.ts.map +1 -0
  329. package/dist/index.js +40 -0
  330. package/dist/index.js.map +1 -0
  331. package/dist/ports/FileSink.d.ts +20 -0
  332. package/dist/ports/FileSink.d.ts.map +1 -0
  333. package/dist/ports/FileSink.js +2 -0
  334. package/dist/ports/FileSink.js.map +1 -0
  335. package/dist/ports/Logger.d.ts +16 -0
  336. package/dist/ports/Logger.d.ts.map +1 -0
  337. package/dist/ports/Logger.js +7 -0
  338. package/dist/ports/Logger.js.map +1 -0
  339. package/dist/ports/PendingActionStore.d.ts +84 -0
  340. package/dist/ports/PendingActionStore.d.ts.map +1 -0
  341. package/dist/ports/PendingActionStore.js +16 -0
  342. package/dist/ports/PendingActionStore.js.map +1 -0
  343. package/dist/reads/access.d.ts +4 -0
  344. package/dist/reads/access.d.ts.map +1 -0
  345. package/dist/reads/access.js +129 -0
  346. package/dist/reads/access.js.map +1 -0
  347. package/dist/reads/checkpoints.d.ts +4 -0
  348. package/dist/reads/checkpoints.d.ts.map +1 -0
  349. package/dist/reads/checkpoints.js +152 -0
  350. package/dist/reads/checkpoints.js.map +1 -0
  351. package/dist/reads/files.d.ts +9 -0
  352. package/dist/reads/files.d.ts.map +1 -0
  353. package/dist/reads/files.js +222 -0
  354. package/dist/reads/files.js.map +1 -0
  355. package/dist/reads/incidents.d.ts +4 -0
  356. package/dist/reads/incidents.d.ts.map +1 -0
  357. package/dist/reads/incidents.js +164 -0
  358. package/dist/reads/incidents.js.map +1 -0
  359. package/dist/reads/index.d.ts +11 -0
  360. package/dist/reads/index.d.ts.map +1 -0
  361. package/dist/reads/index.js +51 -0
  362. package/dist/reads/index.js.map +1 -0
  363. package/dist/reads/onboarding.d.ts +4 -0
  364. package/dist/reads/onboarding.d.ts.map +1 -0
  365. package/dist/reads/onboarding.js +41 -0
  366. package/dist/reads/onboarding.js.map +1 -0
  367. package/dist/reads/organization.d.ts +26 -0
  368. package/dist/reads/organization.d.ts.map +1 -0
  369. package/dist/reads/organization.js +45 -0
  370. package/dist/reads/organization.js.map +1 -0
  371. package/dist/reads/patrollers.d.ts +4 -0
  372. package/dist/reads/patrollers.d.ts.map +1 -0
  373. package/dist/reads/patrollers.js +156 -0
  374. package/dist/reads/patrollers.js.map +1 -0
  375. package/dist/reads/plan.d.ts +4 -0
  376. package/dist/reads/plan.d.ts.map +1 -0
  377. package/dist/reads/plan.js +195 -0
  378. package/dist/reads/plan.js.map +1 -0
  379. package/dist/reads/rounds.d.ts +4 -0
  380. package/dist/reads/rounds.d.ts.map +1 -0
  381. package/dist/reads/rounds.js +160 -0
  382. package/dist/reads/rounds.js.map +1 -0
  383. package/dist/reads/routes.d.ts +4 -0
  384. package/dist/reads/routes.d.ts.map +1 -0
  385. package/dist/reads/routes.js +34 -0
  386. package/dist/reads/routes.js.map +1 -0
  387. package/dist/reads/support/access-locations.d.ts +22 -0
  388. package/dist/reads/support/access-locations.d.ts.map +1 -0
  389. package/dist/reads/support/access-locations.js +55 -0
  390. package/dist/reads/support/access-locations.js.map +1 -0
  391. package/dist/reads/support/excel.d.ts +10 -0
  392. package/dist/reads/support/excel.d.ts.map +1 -0
  393. package/dist/reads/support/excel.js +35 -0
  394. package/dist/reads/support/excel.js.map +1 -0
  395. package/dist/reads/support/params.d.ts +50 -0
  396. package/dist/reads/support/params.d.ts.map +1 -0
  397. package/dist/reads/support/params.js +73 -0
  398. package/dist/reads/support/params.js.map +1 -0
  399. package/dist/reads/support/resolve.d.ts +17 -0
  400. package/dist/reads/support/resolve.d.ts.map +1 -0
  401. package/dist/reads/support/resolve.js +33 -0
  402. package/dist/reads/support/resolve.js.map +1 -0
  403. package/dist/reads/support/results.d.ts +22 -0
  404. package/dist/reads/support/results.d.ts.map +1 -0
  405. package/dist/reads/support/results.js +41 -0
  406. package/dist/reads/support/results.js.map +1 -0
  407. package/dist/reads/support/roles.d.ts +13 -0
  408. package/dist/reads/support/roles.d.ts.map +1 -0
  409. package/dist/reads/support/roles.js +27 -0
  410. package/dist/reads/support/roles.js.map +1 -0
  411. package/dist/reads/support/scans.d.ts +31 -0
  412. package/dist/reads/support/scans.d.ts.map +1 -0
  413. package/dist/reads/support/scans.js +66 -0
  414. package/dist/reads/support/scans.js.map +1 -0
  415. package/dist/reads/types.d.ts +48 -0
  416. package/dist/reads/types.d.ts.map +1 -0
  417. package/dist/reads/types.js +5 -0
  418. package/dist/reads/types.js.map +1 -0
  419. package/dist/reads/users.d.ts +4 -0
  420. package/dist/reads/users.d.ts.map +1 -0
  421. package/dist/reads/users.js +57 -0
  422. package/dist/reads/users.js.map +1 -0
  423. package/dist/testing/FakePatrolTechGateway.d.ts +212 -0
  424. package/dist/testing/FakePatrolTechGateway.d.ts.map +1 -0
  425. package/dist/testing/FakePatrolTechGateway.js +712 -0
  426. package/dist/testing/FakePatrolTechGateway.js.map +1 -0
  427. package/dist/testing/RecordingFileSink.d.ts +12 -0
  428. package/dist/testing/RecordingFileSink.d.ts.map +1 -0
  429. package/dist/testing/RecordingFileSink.js +12 -0
  430. package/dist/testing/RecordingFileSink.js.map +1 -0
  431. package/dist/testing/index.d.ts +4 -0
  432. package/dist/testing/index.d.ts.map +1 -0
  433. package/dist/testing/index.js +4 -0
  434. package/dist/testing/index.js.map +1 -0
  435. package/dist/testing/reads.d.ts +34 -0
  436. package/dist/testing/reads.d.ts.map +1 -0
  437. package/dist/testing/reads.js +39 -0
  438. package/dist/testing/reads.js.map +1 -0
  439. package/package.json +76 -4
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Qué le pasa a una ruta al quitarle checkpoints. Regla del backend: una ruta
3
+ * que se queda sin checkpoints se desactiva (deja de generar rondas) y no se
4
+ * puede volver a activar hasta que tenga alguno. Añadir uno no la reactiva.
5
+ */
6
+ /** El efecto de quitar `quitados` de la ruta (un checkpoint repetido en ella cuenta como uno). */
7
+ export function efectoDeQuitar(ruta, quitados) {
8
+ const vacia = ruta.checkpoints.every((c) => quitados.has(c.checkpointId));
9
+ return { vacia, seDesactiva: vacia && ruta.isActive };
10
+ }
11
+ /**
12
+ * La ruta tal como la dejan los cambios previos del lote, aplicados en el orden
13
+ * en que se ejecutarán: con lo añadido, sin lo quitado y desactivada si en algún
14
+ * momento se quedó vacía.
15
+ */
16
+ export function aplicarCambios(ruta, cambios) {
17
+ return cambios.reduce((r, c) => {
18
+ if (c.op === 'añadir')
19
+ return { ...r, checkpoints: [...r.checkpoints, { checkpointId: c.checkpointId }] };
20
+ const { vacia } = efectoDeQuitar(r, new Set([c.checkpointId]));
21
+ return {
22
+ isActive: r.isActive && !vacia,
23
+ checkpoints: r.checkpoints.filter((x) => x.checkpointId !== c.checkpointId),
24
+ };
25
+ }, ruta);
26
+ }
27
+ //# sourceMappingURL=route-checkpoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-checkpoints.js","sourceRoot":"","sources":["../../src/domain/route-checkpoints.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,kGAAkG;AAClG,MAAM,UAAU,cAAc,CAC5B,IAAwB,EACxB,QAA6B;IAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1E,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;AACxD,CAAC;AAQD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAwB,EACxB,OAAsC;IAEtC,OAAO,OAAO,CAAC,MAAM,CAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACjD,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ;YACnB,OAAO,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;QACrF,MAAM,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO;YACL,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK;YAC9B,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY,CAAC;SAC5E,CAAC;IACJ,CAAC,EAAE,IAAI,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Horarios (franjas) de una ruta. El backend SOLO guarda y compara horas UTC
3
+ * (`HH:MM` + días ISO 1=lun..7=dom); convertir desde la hora local del cliente es
4
+ * cosa de quien envía (`AddTimeWindowBody` en el contrato de la API).
5
+ *
6
+ * Mismo criterio que el panel:
7
+ * se desplazan las dos horas con el desfase de la zona y los días se mueven según
8
+ * lo que le pase a la hora de INICIO (la franja «pertenece» al día en que empieza).
9
+ * Solapes con la regla del backend: semana
10
+ * circular de minutos, intervalos semiabiertos, una franja que acaba antes de
11
+ * empezar cruza la medianoche.
12
+ */
13
+ import type { FixedTextLanguage } from './language.js';
14
+ export declare const DIAS: readonly ["lun", "mar", "mie", "jue", "vie", "sab", "dom"];
15
+ export type Dia = (typeof DIAS)[number];
16
+ /** Tope del panel por ruta (PT dashboard: recurrence.ts `MAX_WINDOWS_PER_ROUTE`): una semana de franjas de una hora. */
17
+ export declare const MAX_HORARIOS_POR_RUTA = 168;
18
+ /** Intervalo mínimo al repetir una franja (el mismo que el generador del panel). */
19
+ export declare const MIN_REPETICION_MIN = 5;
20
+ /** Un horario tal como lo entiende el backend (o su equivalente local): horas `HH:MM` y días ISO. */
21
+ export interface Horario {
22
+ startTime: string;
23
+ endTime: string;
24
+ days: number[];
25
+ }
26
+ /** Lo que dice el cliente: días en los que EMPIEZA, desde/hasta en SU hora y, opcional, «una ronda cada N minutos». */
27
+ export interface Franja {
28
+ dias: readonly Dia[];
29
+ desde: string;
30
+ hasta: string;
31
+ repetir_cada_min?: number;
32
+ }
33
+ /** `HH:MM:SS` (como lo devuelve el backend) → `HH:MM`. */
34
+ export declare const normalizeTime: (t: string) => string;
35
+ /**
36
+ * Los horarios LOCALES de una franja. Sin repetición es uno solo; con
37
+ * `repetir_cada_min` se trocea en horarios consecutivos de esa duración (el
38
+ * último, recortado a `hasta`), y los que empiezan pasada la medianoche caen en
39
+ * el día siguiente: «lun a vie de 20:00 a 05:00 cada hora» da 20-21 … 23-00 de
40
+ * lun a vie y 00-01 … 04-05 de mar a sáb.
41
+ */
42
+ export declare function expandirFranja(f: Franja): Horario[] | {
43
+ error: string;
44
+ };
45
+ /** Hora local → UTC. `offsetMin` es el desfase de la zona (Madrid en verano: +120; Bogotá: -300). */
46
+ export declare const horarioAUtc: (h: Horario, offsetMin: number) => Horario;
47
+ /** UTC → hora local (para enseñárselo al cliente). */
48
+ export declare const horarioALocal: (h: Horario, offsetMin: number) => Horario;
49
+ /** La primera pareja de horarios que comparten algún minuto de la semana, o null. */
50
+ export declare function buscarSolape(horarios: readonly Horario[]): [number, number] | null;
51
+ /** «lun, mar, mié 20:00-21:00» (o en inglés). */
52
+ export declare function describirHorario(h: Horario, idioma?: FixedTextLanguage): string;
53
+ /** Días de una franja tal como los dijo el cliente, en su idioma. */
54
+ export declare const describirDias: (dias: readonly Dia[], idioma?: FixedTextLanguage) => string;
55
+ /**
56
+ * Los horarios en UTC listos para el backend a partir de las franjas locales:
57
+ * expande repeticiones, convierte y comprueba solapes (con los que ya tiene la
58
+ * ruta, si se pasan) y el tope de 168. Los errores van en palabras para el modelo.
59
+ */
60
+ export declare function horariosParaBackend(franjas: readonly Franja[], offsetMin: number, existentesUtc?: readonly Horario[]): Horario[] | {
61
+ error: string;
62
+ };
63
+ /** Un horario de la ruta visto por el cliente: su id, en hora local y en texto. */
64
+ export interface HorarioLocal {
65
+ id: string;
66
+ local: Horario;
67
+ texto: string;
68
+ }
69
+ /**
70
+ * Los horarios de la ruta (UTC, del backend) en hora local, ordenados por
71
+ * primer día y hora: es la numeración que ve el cliente («1. lun 20:00-21:00»)
72
+ * y con la que luego dice cuál borrar.
73
+ */
74
+ export declare function listarHorarios(ventanas: readonly (Horario & {
75
+ id: string;
76
+ })[], offsetMin: number): HorarioLocal[];
77
+ /**
78
+ * Cuál de los horarios dice el cliente: su número en la lista o una descripción
79
+ * («lun 20:00-21:00», «el de las 20:00 a 21:00 del martes»). Casa por horas y,
80
+ * si nombra días, se queda con los que los incluyen. Ninguno o varios → error
81
+ * con la lista numerada para que pregunte.
82
+ */
83
+ export declare function elegirHorario(horarios: readonly HorarioLocal[], entrada: string): {
84
+ item: HorarioLocal;
85
+ } | {
86
+ error: string;
87
+ };
88
+ //# sourceMappingURL=route-schedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-schedule.d.ts","sourceRoot":"","sources":["../../src/domain/route-schedule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,eAAO,MAAM,IAAI,4DAA6D,CAAC;AAC/E,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;AAOxC,wHAAwH;AACxH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,oFAAoF;AACpF,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAKpC,qGAAqG;AACrG,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,uHAAuH;AACvH,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,SAAS,GAAG,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAcD,0DAA0D;AAC1D,eAAO,MAAM,aAAa,GAAI,GAAG,MAAM,KAAG,MAAuB,CAAC;AAElE;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAyBvE;AAaD,qGAAqG;AACrG,eAAO,MAAM,WAAW,GAAI,GAAG,OAAO,EAAE,WAAW,MAAM,KAAG,OAAmC,CAAC;AAChG,sDAAsD;AACtD,eAAO,MAAM,aAAa,GAAI,GAAG,OAAO,EAAE,WAAW,MAAM,KAAG,OAAkC,CAAC;AAmBjG,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAQlF;AAED,iDAAiD;AACjD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAE,iBAAwB,GAAG,MAAM,CAErF;AAED,qEAAqE;AACrE,eAAO,MAAM,aAAa,GAAI,MAAM,SAAS,GAAG,EAAE,EAAE,SAAQ,iBAAwB,KAAG,MAGxE,CAAC;AAEhB;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,SAAS,EAAE,MAAM,EACjB,aAAa,GAAE,SAAS,OAAO,EAAO,GACrC,OAAO,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CA2B/B;AAED,mFAAmF;AACnF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,SAAS,CAAC,OAAO,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,EAC/C,SAAS,EAAE,MAAM,GAChB,YAAY,EAAE,CAWhB;AAcD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,SAAS,YAAY,EAAE,EACjC,OAAO,EAAE,MAAM,GACd;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CA0B5C"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Horarios (franjas) de una ruta. El backend SOLO guarda y compara horas UTC
3
+ * (`HH:MM` + días ISO 1=lun..7=dom); convertir desde la hora local del cliente es
4
+ * cosa de quien envía (`AddTimeWindowBody` en el contrato de la API).
5
+ *
6
+ * Mismo criterio que el panel:
7
+ * se desplazan las dos horas con el desfase de la zona y los días se mueven según
8
+ * lo que le pase a la hora de INICIO (la franja «pertenece» al día en que empieza).
9
+ * Solapes con la regla del backend: semana
10
+ * circular de minutos, intervalos semiabiertos, una franja que acaba antes de
11
+ * empezar cruza la medianoche.
12
+ */
13
+ export const DIAS = ['lun', 'mar', 'mie', 'jue', 'vie', 'sab', 'dom'];
14
+ const DIAS_TEXTO = {
15
+ es: ['lun', 'mar', 'mié', 'jue', 'vie', 'sáb', 'dom'],
16
+ en: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
17
+ fr: ['lun', 'mar', 'mer', 'jeu', 'ven', 'sam', 'dim'],
18
+ };
19
+ /** Tope del panel por ruta (PT dashboard: recurrence.ts `MAX_WINDOWS_PER_ROUTE`): una semana de franjas de una hora. */
20
+ export const MAX_HORARIOS_POR_RUTA = 168;
21
+ /** Intervalo mínimo al repetir una franja (el mismo que el generador del panel). */
22
+ export const MIN_REPETICION_MIN = 5;
23
+ const DAY = 1440;
24
+ const WEEK = 7 * DAY;
25
+ const toMin = (hhmm) => {
26
+ const [h, m] = hhmm.split(':').map(Number);
27
+ return h * 60 + m;
28
+ };
29
+ const toHHMM = (min) => {
30
+ const m = ((min % DAY) + DAY) % DAY;
31
+ return `${String(Math.floor(m / 60)).padStart(2, '0')}:${String(m % 60).padStart(2, '0')}`;
32
+ };
33
+ /** 1..7 desplazado `n` días, dando la vuelta a la semana (dom+1 = lun). */
34
+ const shiftDay = (d, n) => ((((d - 1 + n) % 7) + 7) % 7) + 1;
35
+ const sortDays = (days) => [...new Set(days)].sort((a, b) => a - b);
36
+ /** `HH:MM:SS` (como lo devuelve el backend) → `HH:MM`. */
37
+ export const normalizeTime = (t) => t.slice(0, 5);
38
+ /**
39
+ * Los horarios LOCALES de una franja. Sin repetición es uno solo; con
40
+ * `repetir_cada_min` se trocea en horarios consecutivos de esa duración (el
41
+ * último, recortado a `hasta`), y los que empiezan pasada la medianoche caen en
42
+ * el día siguiente: «lun a vie de 20:00 a 05:00 cada hora» da 20-21 … 23-00 de
43
+ * lun a vie y 00-01 … 04-05 de mar a sáb.
44
+ */
45
+ export function expandirFranja(f) {
46
+ const desde = toMin(f.desde);
47
+ const hasta = toMin(f.hasta);
48
+ if (desde === hasta)
49
+ return {
50
+ error: `La franja ${f.desde}-${f.hasta} empieza y acaba a la misma hora: pregunta al usuario la hora de fin.`,
51
+ };
52
+ const days = sortDays(f.dias.map((d) => DIAS.indexOf(d) + 1));
53
+ if (!f.repetir_cada_min)
54
+ return [{ startTime: f.desde, endTime: f.hasta, days }];
55
+ if (f.repetir_cada_min < MIN_REPETICION_MIN)
56
+ return { error: `No se puede repetir cada menos de ${MIN_REPETICION_MIN} minutos.` };
57
+ const total = hasta > desde ? hasta - desde : hasta + DAY - desde;
58
+ const horarios = [];
59
+ for (let offset = 0; offset < total; offset += f.repetir_cada_min) {
60
+ const start = desde + offset;
61
+ const end = desde + Math.min(offset + f.repetir_cada_min, total);
62
+ const shift = Math.floor(start / DAY);
63
+ horarios.push({
64
+ startTime: toHHMM(start),
65
+ endTime: toHHMM(end),
66
+ days: sortDays(days.map((d) => shiftDay(d, shift))),
67
+ });
68
+ }
69
+ return horarios;
70
+ }
71
+ /** Desplaza un horario `delta` minutos; los días se mueven con la hora de inicio. */
72
+ function desplazar(h, delta) {
73
+ const start = toMin(h.startTime) + delta;
74
+ const shift = start < 0 ? -1 : start >= DAY ? 1 : 0;
75
+ return {
76
+ startTime: toHHMM(start),
77
+ endTime: toHHMM(toMin(h.endTime) + delta),
78
+ days: sortDays(h.days.map((d) => shiftDay(d, shift))),
79
+ };
80
+ }
81
+ /** Hora local → UTC. `offsetMin` es el desfase de la zona (Madrid en verano: +120; Bogotá: -300). */
82
+ export const horarioAUtc = (h, offsetMin) => desplazar(h, -offsetMin);
83
+ /** UTC → hora local (para enseñárselo al cliente). */
84
+ export const horarioALocal = (h, offsetMin) => desplazar(h, offsetMin);
85
+ /** Intervalos semiabiertos del horario en la semana circular (el que cruza el domingo se parte en dos). */
86
+ function intervalos(h) {
87
+ const start = toMin(h.startTime);
88
+ const end = toMin(h.endTime);
89
+ // Que acabe antes de empezar = cruza la medianoche; igual = un minuto (lo que hace el backend).
90
+ const dur = end > start ? end - start : end < start ? end + DAY - start : 1;
91
+ return h.days.flatMap((d) => {
92
+ const a = (d - 1) * DAY + start;
93
+ return a + dur <= WEEK
94
+ ? [[a, a + dur]]
95
+ : [
96
+ [a, WEEK],
97
+ [0, a + dur - WEEK],
98
+ ];
99
+ });
100
+ }
101
+ /** La primera pareja de horarios que comparten algún minuto de la semana, o null. */
102
+ export function buscarSolape(horarios) {
103
+ const iv = horarios.map(intervalos);
104
+ for (let i = 0; i < iv.length; i++) {
105
+ for (let j = i + 1; j < iv.length; j++) {
106
+ if (iv[i].some(([a1, b1]) => iv[j].some(([a2, b2]) => a1 < b2 && a2 < b1)))
107
+ return [i, j];
108
+ }
109
+ }
110
+ return null;
111
+ }
112
+ /** «lun, mar, mié 20:00-21:00» (o en inglés). */
113
+ export function describirHorario(h, idioma = 'es') {
114
+ return `${h.days.map((d) => DIAS_TEXTO[idioma][d - 1]).join(', ')} ${h.startTime}-${h.endTime}`;
115
+ }
116
+ /** Días de una franja tal como los dijo el cliente, en su idioma. */
117
+ export const describirDias = (dias, idioma = 'es') => sortDays(dias.map((d) => DIAS.indexOf(d) + 1))
118
+ .map((d) => DIAS_TEXTO[idioma][d - 1])
119
+ .join(', ');
120
+ /**
121
+ * Los horarios en UTC listos para el backend a partir de las franjas locales:
122
+ * expande repeticiones, convierte y comprueba solapes (con los que ya tiene la
123
+ * ruta, si se pasan) y el tope de 168. Los errores van en palabras para el modelo.
124
+ */
125
+ export function horariosParaBackend(franjas, offsetMin, existentesUtc = []) {
126
+ const locales = [];
127
+ for (const f of franjas) {
128
+ const r = expandirFranja(f);
129
+ if ('error' in r)
130
+ return r;
131
+ locales.push(...r);
132
+ }
133
+ const total = existentesUtc.length + locales.length;
134
+ if (total > MAX_HORARIOS_POR_RUTA) {
135
+ return {
136
+ error: `Serían ${total} horarios y una ruta admite como máximo ${MAX_HORARIOS_POR_RUTA}: propón franjas más largas o menos repeticiones.`,
137
+ };
138
+ }
139
+ const utc = locales.map((h) => horarioAUtc(h, offsetMin));
140
+ const todos = [...existentesUtc, ...utc];
141
+ const solape = buscarSolape(todos);
142
+ if (solape) {
143
+ const txt = (i) => describirHorario(horarioALocal(todos[i], offsetMin));
144
+ const cual = (i) => i < existentesUtc.length ? 'el horario que ya tiene la ruta' : 'el horario';
145
+ return {
146
+ error: `${cual(solape[0])} «${txt(solape[0])}» se solapa con ${cual(solape[1])} «${txt(solape[1])}» (hora del cliente). ` +
147
+ 'Dos horarios de una ruta no pueden compartir ningún minuto: pregunta al usuario cómo quiere ajustarlos.',
148
+ };
149
+ }
150
+ return utc;
151
+ }
152
+ /**
153
+ * Los horarios de la ruta (UTC, del backend) en hora local, ordenados por
154
+ * primer día y hora: es la numeración que ve el cliente («1. lun 20:00-21:00»)
155
+ * y con la que luego dice cuál borrar.
156
+ */
157
+ export function listarHorarios(ventanas, offsetMin) {
158
+ return ventanas
159
+ .map((v) => {
160
+ const local = horarioALocal(v, offsetMin);
161
+ return { id: v.id, local, texto: describirHorario(local) };
162
+ })
163
+ .sort((a, b) => (a.local.days[0] ?? 0) - (b.local.days[0] ?? 0) ||
164
+ a.local.startTime.localeCompare(b.local.startTime));
165
+ }
166
+ const DIA_EN_TEXTO = {
167
+ lun: 1,
168
+ mar: 2,
169
+ mie: 3,
170
+ mié: 3,
171
+ jue: 4,
172
+ vie: 5,
173
+ sab: 6,
174
+ sáb: 6,
175
+ dom: 7,
176
+ };
177
+ /**
178
+ * Cuál de los horarios dice el cliente: su número en la lista o una descripción
179
+ * («lun 20:00-21:00», «el de las 20:00 a 21:00 del martes»). Casa por horas y,
180
+ * si nombra días, se queda con los que los incluyen. Ninguno o varios → error
181
+ * con la lista numerada para que pregunte.
182
+ */
183
+ export function elegirHorario(horarios, entrada) {
184
+ const numerada = horarios.map((h, i) => `${i + 1}. ${h.texto}`).join('; ');
185
+ const pregunta = {
186
+ error: `No sé cuál de los horarios es «${entrada}». Pregunta al usuario cuál (hora local): ${numerada}.`,
187
+ };
188
+ const texto = entrada.trim().toLowerCase();
189
+ if (/^\d+$/.test(texto)) {
190
+ const indice = Number(texto) - 1;
191
+ const h = indice >= 0 ? horarios[indice] : undefined;
192
+ return h ? { item: h } : pregunta;
193
+ }
194
+ const horas = [...texto.matchAll(/(\d{1,2})[:.h](\d{2})/g)].map(([, h, m]) => `${h.padStart(2, '0')}:${m}`);
195
+ const dias = [...texto.matchAll(/\b(lun|mar|mi[eé]|jue|vie|s[aá]b|dom)/g)].map(([d]) => DIA_EN_TEXTO[d]);
196
+ const candidatos = horarios.filter((h) => (horas.length === 0 || h.local.startTime === horas[0]) &&
197
+ (horas.length < 2 || h.local.endTime === horas[1]) &&
198
+ dias.every((d) => h.local.days.includes(d)));
199
+ return candidatos.length === 1 && (horas.length > 0 || dias.length > 0)
200
+ ? { item: candidatos[0] }
201
+ : pregunta;
202
+ }
203
+ //# sourceMappingURL=route-schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-schedule.js","sourceRoot":"","sources":["../../src/domain/route-schedule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Traduce el estado de validación y las señales antifraude de un escaneo a
3
+ * lenguaje de cliente. Sin esto el modelo solo veía `verified` + `flagged` y
4
+ * decía «sospechoso pero ya verificado» inventándose el motivo. Validación y sospecha son independientes: un escaneo puede
5
+ * ser válido y a la vez sospechoso.
6
+ *
7
+ * Fuente: la validación de escaneos y los tipos de fraude del backend.
8
+ */
9
+ /** De vuelta del texto de `validacion` a su estado, para contar (empieza siempre por la palabra del estado). */
10
+ export declare function validationBucket(validacion: string): 'valido' | 'pendiente' | 'rechazado' | null;
11
+ export interface ScanValidationInput {
12
+ validationStatus: string | null;
13
+ validationReason: string | null;
14
+ fraudFlags: {
15
+ flagged?: boolean;
16
+ [regla: string]: unknown;
17
+ } | null;
18
+ }
19
+ export interface ScanExplanation {
20
+ validacion: string;
21
+ /** Vacío si el escaneo no está marcado como sospechoso. */
22
+ motivosSospecha: string[];
23
+ }
24
+ export declare function explainScan(scan: ScanValidationInput): ScanExplanation;
25
+ //# sourceMappingURL=scan-explanation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-explanation.d.ts","sourceRoot":"","sources":["../../src/domain/scan-explanation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,gHAAgH;AAChH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,GAAG,IAAI,CAKhG;AA+CD,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CACpE;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAyBD,wBAAgB,WAAW,CAAC,IAAI,EAAE,mBAAmB,GAAG,eAAe,CAuBtE"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Traduce el estado de validación y las señales antifraude de un escaneo a
3
+ * lenguaje de cliente. Sin esto el modelo solo veía `verified` + `flagged` y
4
+ * decía «sospechoso pero ya verificado» inventándose el motivo. Validación y sospecha son independientes: un escaneo puede
5
+ * ser válido y a la vez sospechoso.
6
+ *
7
+ * Fuente: la validación de escaneos y los tipos de fraude del backend.
8
+ */
9
+ // Sin prometer si cuenta o no en la ronda: con Guardia Estricto un válido fuera
10
+ // de orden no cuenta, y un rechazado con checkpoint identificado sí la avanza.
11
+ const ESTADOS = {
12
+ verified: 'válido: es un escaneo auténtico de un punto real',
13
+ pending_review: 'pendiente de revisión: faltaban datos para verificarlo; no se descarta, y hoy no se puede aprobar ni rechazar a mano',
14
+ rejected: 'rechazado: la verificación falló',
15
+ };
16
+ /** De vuelta del texto de `validacion` a su estado, para contar (empieza siempre por la palabra del estado). */
17
+ export function validationBucket(validacion) {
18
+ if (validacion.startsWith('válido'))
19
+ return 'valido';
20
+ if (validacion.startsWith('pendiente'))
21
+ return 'pendiente';
22
+ if (validacion.startsWith('rechazado'))
23
+ return 'rechazado';
24
+ return null;
25
+ }
26
+ const CHIP_CORRUPTO = 'los datos del chip NFC están corruptos';
27
+ const CLAVE_CHIP = 'problema interno con la clave criptográfica del chip NFC';
28
+ const MOTIVOS = {
29
+ checkpoint_not_found: 'la etiqueta o código no está vinculado a ningún checkpoint',
30
+ checkpoint_archived: 'el checkpoint está archivado (dado de baja)',
31
+ untyped_scan_on_protected_checkpoint: 'escaneo sin datos de verificación en un checkpoint protegido',
32
+ missing_verification_payload: 'faltan los datos de verificación',
33
+ unsupported_verification_type: 'tipo de verificación no soportado',
34
+ no_methods_configured: 'el checkpoint no tiene métodos activos de este tipo',
35
+ method_not_configured: 'el método de verificación no está bien configurado',
36
+ no_matching_method: 'no coincidió con ningún método configurado en el checkpoint',
37
+ invalid_payload: 'datos de verificación inválidos',
38
+ code_mismatch: 'el código no coincide con el del checkpoint',
39
+ invalid_uid: 'el UID de la etiqueta no es válido',
40
+ uid_mismatch: 'el UID de la etiqueta no coincide con el configurado',
41
+ checkpoint_has_no_coords: 'el checkpoint no tiene coordenadas, así que no se puede comprobar la geocerca',
42
+ out_of_radius: 'fuera de la distancia máxima configurada del checkpoint',
43
+ chip_uid_missing: 'falta el UID del chip NFC',
44
+ chip_not_registered: 'el chip NFC no está registrado',
45
+ chip_does_not_belong_to_checkpoint: 'el chip NFC pertenece a otro checkpoint',
46
+ master_key_unavailable: CLAVE_CHIP,
47
+ key_decryption_failed: CLAVE_CHIP,
48
+ invalid_key: CLAVE_CHIP,
49
+ malformed_picc: CHIP_CORRUPTO,
50
+ malformed_cmac: CHIP_CORRUPTO,
51
+ sig_mismatch: 'firma no válida',
52
+ cmac_mismatch: 'firma anticlonado inválida (posible clonación de la etiqueta)',
53
+ counter_replay: 'se detectó una repetición de un escaneo anterior (anticlonado)',
54
+ physical_uid_mismatch: 'etiqueta clonada: el enlace está grabado en un chip físico distinto',
55
+ physical_uid_required: 'falta el UID físico del chip para comprobar que no está clonado',
56
+ };
57
+ const REGLAS_FRAUDE = {
58
+ gpsProximity: 'el GPS del móvil estaba más lejos del punto que la distancia máxima configurada (severidad media)',
59
+ // Falla cuando el punto es subterráneo pero el móvil SÍ tenía cobertura.
60
+ undergroundMode: 'el punto está marcado como subterráneo, pero el móvil tenía cobertura (wifi o datos móviles), lo que sugiere que no estaba en ese lugar (señal leve) (severidad baja)',
61
+ patrollerLocationMismatch: 'el vigilante escaneó en una ubicación a la que no está asignado (severidad alta)',
62
+ };
63
+ function reglaFallida(valor) {
64
+ return (typeof valor === 'object' && valor !== null && valor.status === 'fail');
65
+ }
66
+ /**
67
+ * A cuánto estaba el móvil del punto: con unos metros de más, la distancia es
68
+ * demasiado ajustada; con cientos o miles, el punto está mal situado en el mapa.
69
+ */
70
+ function distanciaGps(valor) {
71
+ const { distanceMeters, accuracyMeters } = valor;
72
+ if (typeof distanceMeters !== 'number')
73
+ return '';
74
+ const precision = typeof accuracyMeters === 'number'
75
+ ? `, con precisión GPS de ±${Math.round(accuracyMeters)} m`
76
+ : '';
77
+ return ` (el móvil estaba a ${Math.round(distanceMeters)} m del punto guardado${precision})`;
78
+ }
79
+ export function explainScan(scan) {
80
+ const estado = scan.validationStatus
81
+ ? (ESTADOS[scan.validationStatus] ?? scan.validationStatus)
82
+ : 'sin estado de validación';
83
+ const motivo = scan.validationReason
84
+ ? (MOTIVOS[scan.validationReason] ?? scan.validationReason)
85
+ : null;
86
+ const validacion = motivo ? `${estado} (motivo: ${motivo})` : estado;
87
+ if (scan.fraudFlags?.flagged !== true)
88
+ return { validacion, motivosSospecha: [] };
89
+ const motivosSospecha = Object.entries(scan.fraudFlags)
90
+ .filter(([regla, valor]) => regla !== 'flagged' && reglaFallida(valor))
91
+ .map(([regla, valor]) => (REGLAS_FRAUDE[regla] ?? regla) + (regla === 'gpsProximity' ? distanciaGps(valor) : ''));
92
+ return {
93
+ validacion,
94
+ motivosSospecha: motivosSospecha.length > 0
95
+ ? motivosSospecha
96
+ : ['marcado como sospechoso sin motivo detallado'],
97
+ };
98
+ }
99
+ //# sourceMappingURL=scan-explanation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-explanation.js","sourceRoot":"","sources":["../../src/domain/scan-explanation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Lo que el CSV necesita de un escaneo reciente. Es un subconjunto estructural
3
+ * del escaneo que devuelve el backend: cualquier `RecentScan` lo cumple, y este
4
+ * módulo no depende de la forma completa del cliente.
5
+ */
6
+ export interface ScanCsvRow {
7
+ timestamp: string;
8
+ checkpointName: string | null;
9
+ patrollerName: string | null;
10
+ fraudFlagged: boolean;
11
+ /** Estado de validación en lenguaje de cliente. */
12
+ validacion: string;
13
+ /** Motivos reales de la sospecha; vacío si no es sospechoso. */
14
+ motivosSospecha: string[];
15
+ dispositivo?: {
16
+ modelo?: string;
17
+ sistema?: string;
18
+ bateriaPct?: number;
19
+ };
20
+ distanciaGpsM?: number;
21
+ }
22
+ /**
23
+ * Una celda: texto neutralizado si parece fórmula y entre comillas si lleva `;`, `,`,
24
+ * tabulador, comillas o saltos.
25
+ */
26
+ export declare function csvCell(value: string | number | null | undefined): string;
27
+ /** `YYYY-MM-DD HH:mm:ss` en la hora del cliente: Excel lo reconoce como fecha en cualquier idioma. */
28
+ export declare function fechaLocal(iso: string, tz: string): string;
29
+ export declare function scansCsv(scans: readonly ScanCsvRow[], opts: {
30
+ tz: string;
31
+ ubicacionDe: (scan: ScanCsvRow) => string;
32
+ }): Buffer;
33
+ type Celda = string | number | null | undefined;
34
+ /** Cabeceras y filas → el fichero. Lo comparten todos los Excel que envía el bot. */
35
+ export declare function csvBytes(cabeceras: readonly string[], filas: readonly (readonly Celda[])[]): Buffer;
36
+ export {};
37
+ //# sourceMappingURL=scans-csv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scans-csv.d.ts","sourceRoot":"","sources":["../../src/domain/scans-csv.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA8BD;;;GAGG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKzE;AAID,sGAAsG;AACtG,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAG1D;AAOD,wBAAgB,QAAQ,CACtB,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,MAAM,CAAA;CAAE,GAC9D,MAAM,CAaR;AAED,KAAK,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAEhD,qFAAqF;AACrF,wBAAgB,QAAQ,CACtB,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,KAAK,EAAE,SAAS,CAAC,SAAS,KAAK,EAAE,CAAC,EAAE,GACnC,MAAM,CAGR"}
@@ -0,0 +1,67 @@
1
+ import { zonedParts } from './timezone.js';
2
+ /**
3
+ * Escaneos como CSV que Excel abre bien sin dependencias: UTF-8 con BOM (sin él
4
+ * Excel lee los acentos como Latin-1) y separador `;` (el de Excel en español y
5
+ * en Latinoamérica, donde la coma es el separador decimal).
6
+ */
7
+ const CABECERAS = [
8
+ 'Fecha y hora',
9
+ 'Vigilante',
10
+ 'Checkpoint',
11
+ 'Ubicación',
12
+ 'Validación',
13
+ 'Sospechoso',
14
+ 'Distancia GPS (m)',
15
+ 'Dispositivo',
16
+ 'Batería %',
17
+ ];
18
+ // Inyección de fórmulas (OWASP «CSV injection»): una celda que empieza por uno
19
+ // de estos caracteres Excel la ejecuta como fórmula. El apóstrofo la deja en texto.
20
+ const FORMULA_RE = /^[=+\-@\t\r]/;
21
+ // Excel con `,` como separador de lista (configuración regional) parte la fila por comas
22
+ // aunque el fichero use `;`: una celda sin comillas como `Nave,=1+1` dejaría el fragmento
23
+ // tras la coma como celda nueva que empieza por `=` y se ejecutaría. Por eso también se
24
+ // entrecomilla toda celda con coma o tabulador.
25
+ const QUOTE_RE = /[";,\t\r\n]/;
26
+ /**
27
+ * Una celda: texto neutralizado si parece fórmula y entre comillas si lleva `;`, `,`,
28
+ * tabulador, comillas o saltos.
29
+ */
30
+ export function csvCell(value) {
31
+ if (value === null || value === undefined)
32
+ return '';
33
+ let text = String(value);
34
+ if (typeof value === 'string' && FORMULA_RE.test(text))
35
+ text = `'${text}`;
36
+ return QUOTE_RE.test(text) ? `"${text.replace(/"/g, '""')}"` : text;
37
+ }
38
+ const dos = (n) => String(n).padStart(2, '0');
39
+ /** `YYYY-MM-DD HH:mm:ss` en la hora del cliente: Excel lo reconoce como fecha en cualquier idioma. */
40
+ export function fechaLocal(iso, tz) {
41
+ const p = zonedParts(new Date(iso), tz);
42
+ return `${p.y}-${dos(p.m)}-${dos(p.d)} ${dos(p.h)}:${dos(p.mi)}:${dos(p.s)}`;
43
+ }
44
+ function dispositivo(scan) {
45
+ const { modelo, sistema } = scan.dispositivo ?? {};
46
+ return [modelo, sistema].filter(Boolean).join(' · ');
47
+ }
48
+ export function scansCsv(scans, opts) {
49
+ const filas = scans.map((s) => [
50
+ fechaLocal(s.timestamp, opts.tz),
51
+ s.patrollerName,
52
+ s.checkpointName,
53
+ opts.ubicacionDe(s),
54
+ s.validacion,
55
+ s.fraudFlagged ? `sí: ${s.motivosSospecha.join('; ')}` : 'no',
56
+ s.distanciaGpsM,
57
+ dispositivo(s),
58
+ s.dispositivo?.bateriaPct,
59
+ ]);
60
+ return csvBytes(CABECERAS, filas);
61
+ }
62
+ /** Cabeceras y filas → el fichero. Lo comparten todos los Excel que envía el bot. */
63
+ export function csvBytes(cabeceras, filas) {
64
+ const lineas = [cabeceras, ...filas].map((fila) => fila.map(csvCell).join(';'));
65
+ return Buffer.from(`\uFEFF${lineas.join('\r\n')}\r\n`, 'utf8');
66
+ }
67
+ //# sourceMappingURL=scans-csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scans-csv.js","sourceRoot":"","sources":["../../src/domain/scans-csv.ts"],"names":[],"mappings":"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"}