@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,112 @@
1
+ import { type FixedTextLanguage } from '../../domain/language.js';
2
+ import type { CheckpointRef, LocationRef } from '../../gateway/index.js';
3
+ import { AccionRechazada } from '../names.js';
4
+ import type { ActionEnv } from '../types.js';
5
+ /** Piezas comunes a los ficheros de acciones (checkpoints, rutas, vigilantes, ubicaciones, usuarios…). */
6
+ /**
7
+ * Lo que resuelve `preparar` (id de ubicación, identificador del
8
+ * vigilante) viaja en los propios parámetros, que son lo único que guarda la
9
+ * acción pendiente; por eso el modelo ve esos campos. `preparar` los
10
+ * sobrescribe SIEMPRE, así que lo que ponga el modelo no llega al backend.
11
+ */
12
+ export declare const INTERNO = "Interno: lo rellena el sistema; no lo rellenes ni lo indiques.";
13
+ /**
14
+ * Los parámetros de una acción que rellena `preparar` (descritos con `INTERNO`): un canal que
15
+ * construye su propio esquema de entrada (el MCP) los quita, porque el modelo no debe rellenarlos
16
+ * y `preparar` los sobrescribe igualmente.
17
+ */
18
+ export declare function internalParamNames(params: Readonly<Record<string, unknown>>): string[];
19
+ /** «Luis Mora (luis@acme.test)», o solo el nombre si no hay email. */
20
+ export declare const quien: (p: {
21
+ usuario: string;
22
+ email?: string;
23
+ }) => string;
24
+ /** La persona con ese email (exacto, sin mayúsculas ni espacios alrededor). */
25
+ export declare function buscarPorEmail<T extends {
26
+ email: string;
27
+ }>(usuarios: readonly T[], email: string): T | undefined;
28
+ /**
29
+ * Al confirmar, una protección que ya no se cumple: «⚠️ No se ha hecho ningún
30
+ * cambio: <motivo>» en el idioma del cliente (queda `failed` sin tocar nada).
31
+ */
32
+ export declare function sinCambios(idioma: FixedTextLanguage, motivo: Record<FixedTextLanguage, string>): AccionRechazada;
33
+ /**
34
+ * El consejo al modelo cuando la organización está en un límite: con `upsell`
35
+ * (el bot) se le suma ampliar el plan; sin él (MCP), solo las alternativas.
36
+ */
37
+ export interface ConsejoDeLimite {
38
+ /** Termina donde el bot añade «o mejorar el plan en Licencia (…)». */
39
+ conPlan: string;
40
+ /** Frase completa, sin plan ni Licencia. */
41
+ sinPlan: string;
42
+ }
43
+ /**
44
+ * Anticipa el 402 de plazas de gestor (Editor o Admin): el error al modelo con
45
+ * el consejo de quien llama, o null si cabe (o el plan no tiene límite). Sin
46
+ * `upsell`, el límite va con sus números y sin el nombre del plan.
47
+ */
48
+ export declare function sinPlazaDeGestor({ gateway, urls, upsell }: Pick<ActionEnv, 'gateway' | 'urls' | 'upsell'>, ctx: {
49
+ org: {
50
+ orgId: string;
51
+ };
52
+ token: string;
53
+ }, consejo: ConsejoDeLimite): Promise<string | null>;
54
+ /** «A», «B», «C»; con más de `max`, los primeros y «y N más» en el idioma del cliente. */
55
+ export declare function listaCitada(nombres: readonly string[], idioma?: FixedTextLanguage, max?: number): string;
56
+ /**
57
+ * Aviso, antes de confirmar, de las rutas que se quedarán sin checkpoints y que
58
+ * el backend desactivará. Uno solo para quitar de una ruta y para archivar.
59
+ */
60
+ export declare function avisoRutaVacia(rutas: readonly string[], idioma: FixedTextLanguage): string;
61
+ /**
62
+ * Nombre dicho por el usuario → elemento, o el error con las opciones para que
63
+ * el modelo pregunte («No encuentro el checkpoint «X»…», «Hay varios checkpoints…»).
64
+ */
65
+ export declare function resolver<T>(valor: string, items: readonly T[], nameOf: (item: T) => string, [singular, plural]: [string, string], opts?: {
66
+ idOf?: (item: T) => string;
67
+ etiqueta?: (item: T) => string;
68
+ }): {
69
+ item: T;
70
+ } | {
71
+ error: string;
72
+ };
73
+ /** Íd. con el texto de las acciones de rutas (`entre`: «las rutas»): «No encuentro «X» entre las rutas…». */
74
+ export declare function elegir<T>(nombre: string, items: readonly T[], nameOf: (item: T) => string, entre: string): {
75
+ item: T;
76
+ } | {
77
+ error: string;
78
+ };
79
+ /** Checkpoint por nombre, acotado a una ubicación si la dice (dos pueden llamarse igual en ubicaciones distintas). */
80
+ export declare function resolverCheckpoint(items: CheckpointRef[], checkpoint: string, ubicacion?: string): {
81
+ item: CheckpointRef;
82
+ } | {
83
+ error: string;
84
+ };
85
+ /** La ubicación dicha por el usuario; sin decirla, la única que tenga. `para` completa «pregúntale en cuál …». */
86
+ export declare function ubicacionPara(ubicaciones: LocationRef[], nombre: string | undefined, para: string): {
87
+ item: LocationRef;
88
+ } | {
89
+ error: string;
90
+ };
91
+ /**
92
+ * ¿Pudo el backend aplicar la escritura aunque la respuesta fuera un error?
93
+ * Red, timeout o 5xx: puede que sí (hay que comprobarlo antes de decir que no
94
+ * se hizo nada). Un 4xx es un rechazo: seguro que no.
95
+ */
96
+ export declare function maybeApplied(err: unknown): boolean;
97
+ /**
98
+ * Anticipa el 402/409 de checkpoints del plan (crear y desarchivar cuentan
99
+ * igual): nunca se confirma un cobro extra desde aquí. Devuelve el error al
100
+ * modelo (cada consejo recibe «Ha llegado al límite … (3 de 5)»), o null si
101
+ * cabe. Sin `upsell`, el límite no nombra el plan y se usa `sinPlan`.
102
+ */
103
+ export declare function sinPlazaDeCheckpoint({ gateway, upsell }: Pick<ActionEnv, 'gateway' | 'upsell'>, ctx: {
104
+ org: {
105
+ orgId: string;
106
+ };
107
+ token: string;
108
+ }, consejo: {
109
+ conPlan: (alLimite: string) => string;
110
+ sinPlan: (alLimite: string) => string;
111
+ }): Promise<string | null>;
112
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/actions/support/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ import { PatrolTechApiError } from '../../domain/backend-errors.js';
2
+ import { segunIdioma } from '../../domain/language.js';
3
+ import { resolveByName } from '../../domain/resolve-by-name.js';
4
+ import { AccionRechazada } from '../names.js';
5
+ import { elegirUbicacion } from './elegir-ubicacion.js';
6
+ /** Piezas comunes a los ficheros de acciones (checkpoints, rutas, vigilantes, ubicaciones, usuarios…). */
7
+ /**
8
+ * Lo que resuelve `preparar` (id de ubicación, identificador del
9
+ * vigilante) viaja en los propios parámetros, que son lo único que guarda la
10
+ * acción pendiente; por eso el modelo ve esos campos. `preparar` los
11
+ * sobrescribe SIEMPRE, así que lo que ponga el modelo no llega al backend.
12
+ */
13
+ export const INTERNO = 'Interno: lo rellena el sistema; no lo rellenes ni lo indiques.';
14
+ /**
15
+ * Los parámetros de una acción que rellena `preparar` (descritos con `INTERNO`): un canal que
16
+ * construye su propio esquema de entrada (el MCP) los quita, porque el modelo no debe rellenarlos
17
+ * y `preparar` los sobrescribe igualmente.
18
+ */
19
+ export function internalParamNames(params) {
20
+ return Object.entries(params)
21
+ .filter(([, schema]) => schema.description === INTERNO)
22
+ .map(([name]) => name);
23
+ }
24
+ /** «Luis Mora (luis@acme.test)», o solo el nombre si no hay email. */
25
+ export const quien = (p) => `${p.usuario}${p.email ? ` (${p.email})` : ''}`;
26
+ /** La persona con ese email (exacto, sin mayúsculas ni espacios alrededor). */
27
+ export function buscarPorEmail(usuarios, email) {
28
+ const buscado = email.trim().toLowerCase();
29
+ return usuarios.find((u) => u.email.trim().toLowerCase() === buscado);
30
+ }
31
+ /**
32
+ * Al confirmar, una protección que ya no se cumple: «⚠️ No se ha hecho ningún
33
+ * cambio: <motivo>» en el idioma del cliente (queda `failed` sin tocar nada).
34
+ */
35
+ export function sinCambios(idioma, motivo) {
36
+ return new AccionRechazada(segunIdioma(idioma, {
37
+ es: `⚠️ No se ha hecho ningún cambio: ${motivo.es}`,
38
+ en: `⚠️ No changes have been made: ${motivo.en}`,
39
+ fr: `⚠️ Aucune modification n'a été effectuée : ${motivo.fr}`,
40
+ }));
41
+ }
42
+ /**
43
+ * Anticipa el 402 de plazas de gestor (Editor o Admin): el error al modelo con
44
+ * el consejo de quien llama, o null si cabe (o el plan no tiene límite). Sin
45
+ * `upsell`, el límite va con sus números y sin el nombre del plan.
46
+ */
47
+ export async function sinPlazaDeGestor({ gateway, urls, upsell }, ctx, consejo) {
48
+ const plan = await gateway.getPlanUsage(ctx.org.orgId, ctx.token);
49
+ const g = plan.uso?.gestores;
50
+ if (!g || g.limite === null || g.usados < g.limite)
51
+ return null;
52
+ if (!upsell) {
53
+ return (`Ha llegado al límite de gestores (Editor o Admin) de la organización (${g.usados} de ${g.limite}). ` +
54
+ `No lo propongas así: ${consejo.sinPlan}.`);
55
+ }
56
+ return (`Ha llegado al límite de gestores (Editor o Admin) de su plan ${plan.plan} (${g.usados} de ${g.limite}). No lo propongas así: ` +
57
+ `${consejo.conPlan} o mejorar el plan en Licencia (${urls.license}).`);
58
+ }
59
+ /** Opciones que se le dan al modelo para que pregunte (las demás se cuentan con «y N más»). */
60
+ const MAX_OPCIONES = 15;
61
+ /** Nombres que se citan en un resumen o un resultado: la confirmación tiene que poder leerse entera. */
62
+ const MAX_CITADOS = 10;
63
+ /** «A», «B», «C»; con más de `max`, los primeros y «y N más» en el idioma del cliente. */
64
+ export function listaCitada(nombres, idioma = 'es', max = MAX_CITADOS) {
65
+ const citados = nombres
66
+ .slice(0, max)
67
+ .map((n) => `«${n}»`)
68
+ .join(', ');
69
+ const resto = nombres.length - max;
70
+ if (resto <= 0)
71
+ return citados;
72
+ return `${citados} ${segunIdioma(idioma, { es: `y ${resto} más`, en: `and ${resto} more`, fr: `et ${resto} de plus` })}`;
73
+ }
74
+ /**
75
+ * Aviso, antes de confirmar, de las rutas que se quedarán sin checkpoints y que
76
+ * el backend desactivará. Uno solo para quitar de una ruta y para archivar.
77
+ */
78
+ export function avisoRutaVacia(rutas, idioma) {
79
+ const nombres = listaCitada(rutas, idioma);
80
+ if (rutas.length === 1) {
81
+ return segunIdioma(idioma, {
82
+ es: `⚠️ La ruta ${nombres} se quedará sin checkpoints y se desactivará: no generará rondas hasta que le añadas checkpoints y la vuelvas a activar.`,
83
+ en: `⚠️ The route ${nombres} will be left without checkpoints and deactivated: it won't generate rounds until you add checkpoints and activate it again.`,
84
+ fr: `⚠️ Le parcours ${nombres} restera sans checkpoints et sera désactivé : il ne générera plus de rondes tant que vous n'y ajouterez pas de checkpoints et ne le réactiverez pas.`,
85
+ });
86
+ }
87
+ return segunIdioma(idioma, {
88
+ es: `⚠️ Las rutas ${nombres} se quedarán sin checkpoints y se desactivarán: no generarán rondas hasta que les añadas checkpoints y las vuelvas a activar.`,
89
+ en: `⚠️ The routes ${nombres} will be left without checkpoints and deactivated: they won't generate rounds until you add checkpoints and activate them again.`,
90
+ fr: `⚠️ Les parcours ${nombres} resteront sans checkpoints et seront désactivés : ils ne généreront plus de rondes tant que vous n'y ajouterez pas de checkpoints et ne les réactiverez pas.`,
91
+ });
92
+ }
93
+ /**
94
+ * Nombre dicho por el usuario → elemento, o el error con las opciones para que
95
+ * el modelo pregunte («No encuentro el checkpoint «X»…», «Hay varios checkpoints…»).
96
+ */
97
+ export function resolver(valor, items, nameOf, [singular, plural], opts = {}) {
98
+ const r = resolveByName(valor, items, nameOf, { idOf: opts.idOf });
99
+ if (r.kind === 'found')
100
+ return { item: r.item };
101
+ const lista = listaCitada((r.kind === 'ambiguous' ? r.matches : items).map(opts.etiqueta ?? nameOf), 'es', MAX_OPCIONES);
102
+ if (r.kind === 'ambiguous') {
103
+ return {
104
+ error: `Hay varios ${plural} que casan con «${valor}»: pregunta al usuario cuál (${lista}).`,
105
+ };
106
+ }
107
+ return {
108
+ error: `No encuentro ${singular} «${valor}». ${lista ? `Pregunta al usuario cuál: ${lista}.` : `No hay ${plural}.`}`,
109
+ };
110
+ }
111
+ /** Íd. con el texto de las acciones de rutas (`entre`: «las rutas»): «No encuentro «X» entre las rutas…». */
112
+ export function elegir(nombre, items, nameOf, entre) {
113
+ const r = resolveByName(nombre, items, nameOf);
114
+ if (r.kind === 'found')
115
+ return { item: r.item };
116
+ const opciones = (r.kind === 'ambiguous' ? r.matches : items).map(nameOf);
117
+ const motivo = r.kind === 'ambiguous'
118
+ ? `«${nombre}» casa con varios de ${entre}`
119
+ : `No encuentro «${nombre}» entre ${entre}`;
120
+ return {
121
+ error: `${motivo}. Pregunta al usuario cuál${opciones.length ? `: ${listaCitada(opciones, 'es', MAX_OPCIONES)}` : ''}.`,
122
+ };
123
+ }
124
+ /** Checkpoint por nombre, acotado a una ubicación si la dice (dos pueden llamarse igual en ubicaciones distintas). */
125
+ export function resolverCheckpoint(items, checkpoint, ubicacion) {
126
+ let candidatos = items;
127
+ if (ubicacion?.trim()) {
128
+ const ubicaciones = [
129
+ ...new Map(items.map((c) => [c.locationId, { id: c.locationId, name: c.locationName }])).values(),
130
+ ];
131
+ const u = resolver(ubicacion, ubicaciones, (l) => l.name, ['la ubicación', 'ubicaciones']);
132
+ if ('error' in u)
133
+ return u;
134
+ candidatos = items.filter((c) => c.locationId === u.item.id);
135
+ }
136
+ return resolver(checkpoint, candidatos, (c) => c.name, ['el checkpoint', 'checkpoints'], {
137
+ etiqueta: (c) => `${c.name} (${c.locationName})`,
138
+ });
139
+ }
140
+ /** La ubicación dicha por el usuario; sin decirla, la única que tenga. `para` completa «pregúntale en cuál …». */
141
+ export function ubicacionPara(ubicaciones, nombre, para) {
142
+ return elegirUbicacion(ubicaciones, nombre, {
143
+ sinUbicaciones: 'La organización no tiene ubicaciones: primero hay que crear una en el panel (Ubicaciones).',
144
+ preguntar: (opciones) => `El usuario tiene varias ubicaciones: pregúntale en cuál ${para} (${opciones}).`,
145
+ });
146
+ }
147
+ /**
148
+ * ¿Pudo el backend aplicar la escritura aunque la respuesta fuera un error?
149
+ * Red, timeout o 5xx: puede que sí (hay que comprobarlo antes de decir que no
150
+ * se hizo nada). Un 4xx es un rechazo: seguro que no.
151
+ */
152
+ export function maybeApplied(err) {
153
+ return !(err instanceof PatrolTechApiError) || err.status >= 500;
154
+ }
155
+ /**
156
+ * Anticipa el 402/409 de checkpoints del plan (crear y desarchivar cuentan
157
+ * igual): nunca se confirma un cobro extra desde aquí. Devuelve el error al
158
+ * modelo (cada consejo recibe «Ha llegado al límite … (3 de 5)»), o null si
159
+ * cabe. Sin `upsell`, el límite no nombra el plan y se usa `sinPlan`.
160
+ */
161
+ export async function sinPlazaDeCheckpoint({ gateway, upsell }, ctx, consejo) {
162
+ const plan = await gateway.getPlanUsage(ctx.org.orgId, ctx.token);
163
+ const cps = plan.uso?.checkpoints;
164
+ if (!cps || cps.incluidos === null || cps.usados < cps.incluidos)
165
+ return null;
166
+ if (!upsell) {
167
+ return consejo.sinPlan(`Ha llegado al límite de checkpoints de la organización (${cps.usados} de ${cps.incluidos})`);
168
+ }
169
+ return consejo.conPlan(`Ha llegado al límite de checkpoints de su plan ${plan.plan} (${cps.usados} de ${cps.incluidos})`);
170
+ }
171
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/actions/support/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { FixedTextLanguage } from '../../domain/language.js';
2
+ import { type PatrolTechUrls } from '../../domain/urls.js';
3
+ /** Textos fijos del motor de acciones en un idioma. */
4
+ export interface ActionTexts {
5
+ intro: string;
6
+ pregunta: string;
7
+ sinBotones: string;
8
+ confirmar: string;
9
+ cancelar: string;
10
+ cancelado: string;
11
+ caducada: string;
12
+ noPendiente: string;
13
+ noDisponible: string;
14
+ sinSesion: string;
15
+ sinCambiosAun: string;
16
+ /** Cierre de un lote con fallos: cuántas se hicieron y los números (de la lista) de las que no. */
17
+ loteResumen: (hechas: number, total: number, fallidas: number[]) => string;
18
+ /** Al ejecutar, el backend pidió aceptar las políticas (451): la propuesta sigue viva para volver a confirmarla. */
19
+ politicasPendientes: string;
20
+ }
21
+ /**
22
+ * Textos fijos del motor de acciones (no los escribe el modelo). En español,
23
+ * inglés y francés; el idioma lo decide `fixedTextLanguage`. `urls` son los
24
+ * enlaces que citan (los mismos que se dan a `actionCatalog`; por defecto, los de producción).
25
+ */
26
+ export declare function actionTexts(urls?: Partial<PatrolTechUrls>): Record<FixedTextLanguage, ActionTexts>;
27
+ /** Botones del siguiente paso de la puesta en marcha. Máximo 20 caracteres (botón de WhatsApp; lo vigila un test). */
28
+ export type NextStepButton = 'vigilante' | 'otroVigilante' | 'checkpoint' | 'otroCheckpoint' | 'ruta' | 'anadirARuta' | 'probarEscaneo' | 'yaEscaneado' | 'rondas';
29
+ /**
30
+ * Textos fijos del siguiente paso de la puesta en marcha (tras crear un
31
+ * checkpoint, un vigilante o una ruta, y en el nudge de una cuenta a medio
32
+ * arrancar). Al pulsar un botón llega su texto como un mensaje más del cliente
33
+ * y lo contesta el modelo con sus herramientas.
34
+ */
35
+ export declare const NEXT_STEP_TEXTS: Record<FixedTextLanguage, {
36
+ faltaCheckpoint: string;
37
+ faltaVigilante: string;
38
+ faltaEscaneo: string;
39
+ trasCheckpointSinEscaneo: string;
40
+ trasCheckpointSinRutas: string;
41
+ trasCheckpointConRutas: string;
42
+ trasVigilante: string;
43
+ trasVigilanteSinCheckpoints: string;
44
+ trasRuta: string;
45
+ botones: Record<NextStepButton, string>;
46
+ }>;
47
+ //# sourceMappingURL=texts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"texts.d.ts","sourceRoot":"","sources":["../../../src/actions/support/texts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAExE,uDAAuD;AACvD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,mGAAmG;IACnG,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;IAC3E,oHAAoH;IACpH,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,IAAI,GAAE,OAAO,CAAC,cAAc,CAAM,GACjC,MAAM,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAiExC;AAED,sHAAsH;AACtH,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,eAAe,GACf,YAAY,GACZ,gBAAgB,GAChB,MAAM,GACN,aAAa,GACb,eAAe,GACf,aAAa,GACb,QAAQ,CAAC;AAEb;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAClC,iBAAiB,EACjB;IACE,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,MAAM,CAAC;IACjC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,2BAA2B,EAAE,MAAM,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;CACzC,CA0FF,CAAC"}
@@ -0,0 +1,134 @@
1
+ import { resolveUrls } from '../../domain/urls.js';
2
+ /**
3
+ * Textos fijos del motor de acciones (no los escribe el modelo). En español,
4
+ * inglés y francés; el idioma lo decide `fixedTextLanguage`. `urls` son los
5
+ * enlaces que citan (los mismos que se dan a `actionCatalog`; por defecto, los de producción).
6
+ */
7
+ export function actionTexts(urls = {}) {
8
+ const { dashboard } = resolveUrls(urls);
9
+ return {
10
+ es: {
11
+ intro: 'Voy a hacer esto por ti:',
12
+ pregunta: '¿Lo confirmas?',
13
+ sinBotones: 'Responde «sí» para confirmarlo o «no» para cancelarlo.',
14
+ confirmar: 'Confirmar',
15
+ cancelar: 'Cancelar',
16
+ cancelado: 'Cancelado, no he cambiado nada.',
17
+ caducada: 'La propuesta caducó; ¿la preparo de nuevo?',
18
+ noPendiente: 'Esa acción ya no está pendiente.',
19
+ noDisponible: 'Esa acción ya no está disponible desde aquí. No se ha hecho ningún cambio.',
20
+ sinSesion: 'No he podido comprobar tu usuario en el panel. No se ha hecho ningún cambio; inténtalo de nuevo en unos minutos.',
21
+ sinCambiosAun: 'Aún no he hecho ningún cambio. ¿Quieres que lo prepare para que lo confirmes?',
22
+ loteResumen: (hechas, total, fallidas) => `Hecho: ${hechas} de ${total}. No se ha hecho: ${fallidas.join(', ')}.`,
23
+ politicasPendientes: `Antes de hacerlo tienes que aceptar las políticas vigentes en el panel (${dashboard}). ` +
24
+ 'Cuando las aceptes, vuelve a pulsar *Confirmar*: lo tengo preparado.',
25
+ },
26
+ en: {
27
+ intro: "Here's what I'll do for you:",
28
+ pregunta: 'Do you confirm?',
29
+ sinBotones: 'Reply «yes» to confirm or «no» to cancel.',
30
+ confirmar: 'Confirm',
31
+ cancelar: 'Cancel',
32
+ cancelado: "Cancelled, I haven't changed anything.",
33
+ caducada: 'That proposal expired; shall I prepare it again?',
34
+ noPendiente: 'That action is no longer pending.',
35
+ noDisponible: 'That action is no longer available from here. No changes have been made.',
36
+ sinSesion: "I couldn't verify your user in the dashboard. No changes have been made; please try again in a few minutes.",
37
+ sinCambiosAun: "I haven't made any changes yet. Would you like me to prepare it so you can confirm it?",
38
+ loteResumen: (hechas, total, fallidas) => `Done: ${hechas} of ${total}. Not done: ${fallidas.join(', ')}.`,
39
+ politicasPendientes: `Before I can do it you need to accept the current policies in the dashboard (${dashboard}). ` +
40
+ "Once you've accepted them, press *Confirm* again: I have it ready.",
41
+ },
42
+ fr: {
43
+ intro: 'Voici ce que je vais faire pour vous :',
44
+ pregunta: 'Vous confirmez ?',
45
+ sinBotones: 'Répondez «oui» pour confirmer ou «non» pour annuler.',
46
+ confirmar: 'Confirmer',
47
+ cancelar: 'Annuler',
48
+ cancelado: "C'est annulé, je n'ai rien modifié.",
49
+ caducada: 'La proposition a expiré ; voulez-vous que je la prépare à nouveau ?',
50
+ noPendiente: "Cette action n'est plus en attente.",
51
+ noDisponible: "Cette action n'est plus disponible ici. Aucune modification n'a été effectuée.",
52
+ sinSesion: "Je n'ai pas pu vérifier votre utilisateur dans le tableau de bord. Aucune modification n'a été effectuée ; réessayez dans quelques minutes.",
53
+ sinCambiosAun: "Je n'ai encore rien modifié. Voulez-vous que je le prépare pour que vous puissiez le confirmer ?",
54
+ loteResumen: (hechas, total, fallidas) => `Fait : ${hechas} sur ${total}. Non fait : ${fallidas.join(', ')}.`,
55
+ politicasPendientes: `Pour que je puisse le faire, acceptez les politiques en vigueur dans le tableau de bord (${dashboard}), ` +
56
+ 'puis appuyez à nouveau sur *Confirmer* : tout est prêt de mon côté.',
57
+ },
58
+ };
59
+ }
60
+ /**
61
+ * Textos fijos del siguiente paso de la puesta en marcha (tras crear un
62
+ * checkpoint, un vigilante o una ruta, y en el nudge de una cuenta a medio
63
+ * arrancar). Al pulsar un botón llega su texto como un mensaje más del cliente
64
+ * y lo contesta el modelo con sus herramientas.
65
+ */
66
+ export const NEXT_STEP_TEXTS = {
67
+ es: {
68
+ faltaCheckpoint: 'Siguiente paso: crear tu primer checkpoint; te mando su QR para imprimirlo.',
69
+ faltaVigilante: 'Siguiente paso: dar de alta a tu vigilante para que pueda escanear los QR.',
70
+ faltaEscaneo: 'Siguiente paso: que tu vigilante instale la app «Patrol Tech Scan» en su móvil y escanee uno de los QR. Así comprobamos que todo funciona de principio a fin antes de montar las rondas.',
71
+ trasCheckpointSinEscaneo: 'Siguiente paso: imprime el QR y que tu vigilante, con la app «Patrol Tech Scan» instalada, lo escanee. Es lo más importante ahora: comprobar que el escaneo llega bien antes de montar las rondas.',
72
+ trasCheckpointSinRutas: 'Siguiente paso: imprime el QR y colócalo en su sitio. Como ya funcionan los escaneos, puedes crear una ruta para controlar las rondas con horario.',
73
+ trasCheckpointConRutas: 'Siguiente paso: imprime el QR y colócalo en su sitio. Si quieres que se revise en las rondas, añádelo a una ruta.',
74
+ trasVigilante: 'Siguiente paso: reenvíale el mensaje con su acceso para que instale la app y escanee uno de los QR. Cuando lo haga, lo comprobamos juntos.',
75
+ trasVigilanteSinCheckpoints: 'Siguiente paso: crear tu primer checkpoint para que tu vigilante tenga un QR que escanear.',
76
+ trasRuta: 'Siguiente paso: que tu vigilante haga una ronda de prueba escaneando los QR de la ruta; después te cuento cómo ha ido.',
77
+ botones: {
78
+ vigilante: 'Alta de un vigilante',
79
+ otroVigilante: 'Otro vigilante',
80
+ checkpoint: 'Crear un checkpoint',
81
+ otroCheckpoint: 'Otro checkpoint',
82
+ ruta: 'Crear una ruta',
83
+ anadirARuta: 'Añadir a una ruta',
84
+ probarEscaneo: 'Probar un escaneo',
85
+ yaEscaneado: 'Ya ha escaneado',
86
+ rondas: 'Cómo van las rondas',
87
+ },
88
+ },
89
+ en: {
90
+ faltaCheckpoint: "Next step: create your first checkpoint; I'll send you its QR code to print.",
91
+ faltaVigilante: 'Next step: add your guard so they can scan the QR codes.',
92
+ faltaEscaneo: 'Next step: have your guard install the «Patrol Tech Scan» app on their phone and scan one of the QR codes. That way we check everything works end to end before setting up rounds.',
93
+ trasCheckpointSinEscaneo: 'Next step: print the QR code and have your guard scan it with the «Patrol Tech Scan» app installed. That is the key thing now: checking the scan arrives before setting up rounds.',
94
+ trasCheckpointSinRutas: 'Next step: print the QR code and put it in place. Since scans are already working, you can create a route to control rounds on a schedule.',
95
+ trasCheckpointConRutas: 'Next step: print the QR code and put it in place. If you want it checked on the rounds, add it to a route.',
96
+ trasVigilante: 'Next step: forward them the message with their access so they install the app and scan one of the QR codes. Once they do, we check it together.',
97
+ trasVigilanteSinCheckpoints: 'Next step: create your first checkpoint so your guard has a QR code to scan.',
98
+ trasRuta: "Next step: have your guard do a test round scanning the route's QR codes; then I'll tell you how it went.",
99
+ botones: {
100
+ vigilante: 'Add a guard',
101
+ otroVigilante: 'Another guard',
102
+ checkpoint: 'Create a checkpoint',
103
+ otroCheckpoint: 'Another checkpoint',
104
+ ruta: 'Create a route',
105
+ anadirARuta: 'Add to a route',
106
+ probarEscaneo: 'Test a scan',
107
+ yaEscaneado: 'Guard has scanned',
108
+ rondas: 'Check the rounds',
109
+ },
110
+ },
111
+ fr: {
112
+ faltaCheckpoint: 'Prochaine étape : créer votre premier checkpoint ; je vous enverrai son QR code à imprimer.',
113
+ faltaVigilante: "Prochaine étape : ajouter votre agent pour qu'il puisse scanner les QR codes.",
114
+ faltaEscaneo: "Prochaine étape : que votre agent installe l'application «Patrol Tech Scan» sur son téléphone et scanne l'un des QR codes. Ainsi, nous vérifions que tout fonctionne de bout en bout avant de mettre en place les rondes.",
115
+ trasCheckpointSinEscaneo: "Prochaine étape : imprimez le QR code et demandez à votre agent de le scanner avec l'application «Patrol Tech Scan». C'est le plus important maintenant : vérifier que le scan arrive bien avant de mettre en place les rondes.",
116
+ trasCheckpointSinRutas: 'Prochaine étape : imprimez le QR code et placez-le à son emplacement. Comme les scans fonctionnent déjà, vous pouvez créer un parcours pour contrôler les rondes selon un horaire.',
117
+ trasCheckpointConRutas: "Prochaine étape : imprimez le QR code et placez-le à son emplacement. Si vous voulez qu'il soit contrôlé pendant les rondes, ajoutez-le à un parcours.",
118
+ trasVigilante: "Prochaine étape : transférez-lui le message avec son accès pour qu'il installe l'application et scanne l'un des QR codes. Une fois que c'est fait, nous le vérifions ensemble.",
119
+ trasVigilanteSinCheckpoints: 'Prochaine étape : créer votre premier checkpoint pour que votre agent ait un QR code à scanner.',
120
+ trasRuta: "Prochaine étape : que votre agent fasse une ronde de test en scannant les QR codes du parcours ; ensuite, je vous dirai comment cela s'est passé.",
121
+ botones: {
122
+ vigilante: 'Ajouter un agent',
123
+ otroVigilante: 'Un autre agent',
124
+ checkpoint: 'Créer un checkpoint',
125
+ otroCheckpoint: 'Un autre checkpoint',
126
+ ruta: 'Créer un parcours',
127
+ anadirARuta: 'Ajouter au parcours',
128
+ probarEscaneo: 'Tester un scan',
129
+ yaEscaneado: "L'agent a scanné",
130
+ rondas: 'Voir les rondes',
131
+ },
132
+ },
133
+ };
134
+ //# sourceMappingURL=texts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"texts.js","sourceRoot":"","sources":["../../../src/actions/support/texts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ActionPrepareContext, CambioEnRuta, TurnoDePropuestas } from '../types.js';
2
+ /** El turno de un lote: lecturas compartidas y los cambios ya aceptados en cada ruta. */
3
+ export interface TurnoConRegistro extends TurnoDePropuestas {
4
+ /** Anota los cambios de una propuesta aceptada (en el orden de la lista). */
5
+ registrar(cambios: readonly CambioEnRuta[]): void;
6
+ }
7
+ /**
8
+ * Memo por turno, no una caché con TTL entre turnos. Techo por turno:
9
+ * un `listRoutes` por organización y un `getRouteDetails` por ruta, compartidos
10
+ * por todas las propuestas del lote (máx. 10). Una lectura que falla se olvida
11
+ * para que la siguiente propuesta lo reintente.
12
+ */
13
+ export declare function nuevoTurno(): TurnoConRegistro;
14
+ /** El turno de la propuesta, o el suelto si va sola. */
15
+ export declare const turnoDe: (ctx: ActionPrepareContext) => TurnoDePropuestas;
16
+ //# sourceMappingURL=turno.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turno.d.ts","sourceRoot":"","sources":["../../../src/actions/support/turno.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEzF,yFAAyF;AACzF,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,6EAA6E;IAC7E,SAAS,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,IAAI,CAAC;CACnD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,gBAAgB,CAmB7C;AAQD,wDAAwD;AACxD,eAAO,MAAM,OAAO,GAAI,KAAK,oBAAoB,KAAG,iBAA8C,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Memo por turno, no una caché con TTL entre turnos. Techo por turno:
3
+ * un `listRoutes` por organización y un `getRouteDetails` por ruta, compartidos
4
+ * por todas las propuestas del lote (máx. 10). Una lectura que falla se olvida
5
+ * para que la siguiente propuesta lo reintente.
6
+ */
7
+ export function nuevoTurno() {
8
+ const lecturas = new Map();
9
+ const cambios = new Map();
10
+ return {
11
+ leer(clave, lectura) {
12
+ const hecha = lecturas.get(clave);
13
+ if (hecha)
14
+ return hecha;
15
+ const nueva = lectura();
16
+ lecturas.set(clave, nueva);
17
+ nueva.catch(() => lecturas.delete(clave));
18
+ return nueva;
19
+ },
20
+ cambiosEnRuta: (rutaId) => cambios.get(rutaId) ?? [],
21
+ registrar(nuevos) {
22
+ for (const { rutaId, op, checkpointId } of nuevos) {
23
+ cambios.set(rutaId, [...(cambios.get(rutaId) ?? []), { op, checkpointId }]);
24
+ }
25
+ },
26
+ };
27
+ }
28
+ /** El de una propuesta suelta (sin lote): lee siempre y no hay cambios previos. */
29
+ const TURNO_SUELTO = {
30
+ leer: (_clave, lectura) => lectura(),
31
+ cambiosEnRuta: () => [],
32
+ };
33
+ /** El turno de la propuesta, o el suelto si va sola. */
34
+ export const turnoDe = (ctx) => ctx.turno ?? TURNO_SUELTO;
35
+ //# sourceMappingURL=turno.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turno.js","sourceRoot":"","sources":["../../../src/actions/support/turno.ts"],"names":[],"mappings":"AASA;;;;;GAKG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgC,CAAC;IACxD,OAAO;QACL,IAAI,CAAI,KAAa,EAAE,OAAyB;YAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,KAAK;gBAAE,OAAO,KAAmB,CAAC;YACtC,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC;YACxB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3B,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;QACpD,SAAS,CAAC,MAAM;YACd,KAAK,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,MAAM,EAAE,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,YAAY,GAAsB;IACtC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE;IACpC,aAAa,EAAE,GAAG,EAAE,CAAC,EAAE;CACxB,CAAC;AAEF,wDAAwD;AACxD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAyB,EAAqB,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,YAAY,CAAC"}
@@ -0,0 +1,72 @@
1
+ import { type FixedTextLanguage } from '../../domain/language.js';
2
+ import type { OrgUser, PatrolTechGateway } from '../../gateway/index.js';
3
+ import { type ActionContext, type ActionPrepareContext } from '../types.js';
4
+ /**
5
+ * Quién y qué acceso del panel tocan cambiar el rol y quitar el acceso, y sus dos
6
+ * protecciones (uno mismo, el último Admin de organización) al proponer y al confirmar.
7
+ */
8
+ /** Un rol de la persona en la organización, con el nombre de su ubicación si es de una. */
9
+ export interface Acceso {
10
+ id: string;
11
+ rol: string;
12
+ /** undefined = de toda la organización. */
13
+ ubicacion?: string;
14
+ }
15
+ export declare const esAdminDeOrganizacion: (r: {
16
+ rol: string;
17
+ ambito: string;
18
+ scopeId: string;
19
+ }, orgId: string) => boolean;
20
+ /** «Viewer (solo ver)» o el rol tal cual si el backend trae uno que no conocemos. */
21
+ export declare const etiquetaRol: (rol: string | undefined, idioma: FixedTextLanguage) => string;
22
+ /** La persona por email (exacto, sin mayúsculas) o por nombre, entre los usuarios de la organización. */
23
+ export declare function elegirPersona(usuarios: readonly OrgUser[], dicho: string): {
24
+ item: OrgUser;
25
+ } | {
26
+ error: string;
27
+ };
28
+ export declare const RELLENO_ORGANIZACION: Set<string>;
29
+ export declare const ORGANIZACION: Set<string>;
30
+ /** ¿Dice «el de toda la organización» y nada más? «Nave Global» o «Todas las naves» no. */
31
+ export declare function diceOrganizacion(texto: string): boolean;
32
+ /**
33
+ * Cuál de sus accesos: con uno solo y sin decirlo, ese. Si lo dice, se busca
34
+ * siempre (aunque tenga uno): «quítale el de Norte» a quien solo tiene el de
35
+ * organización no puede quitarle el de organización en silencio.
36
+ */
37
+ export declare function elegirAcceso(nombre: string, accesos: readonly Acceso[], dicho: string | undefined, para: string): {
38
+ item: Acceso;
39
+ } | {
40
+ error: string;
41
+ };
42
+ /** Lo que resuelven las dos acciones en `preparar`: persona, su acceso y la lista para las protecciones. */
43
+ export declare function resolverAcceso(gateway: PatrolTechGateway, ctx: ActionPrepareContext, p: {
44
+ usuario: string;
45
+ acceso?: string;
46
+ }, para: string): Promise<{
47
+ persona: OrgUser;
48
+ acceso: Acceso;
49
+ accesos: Acceso[];
50
+ usuarios: OrgUser[];
51
+ } | {
52
+ error: string;
53
+ }>;
54
+ /** ¿Quitar este rol (o bajarlo de ADMIN) deja la organización sin ningún Admin de organización? */
55
+ export declare function dejaSinAdmin(usuarios: readonly OrgUser[], orgId: string, rolId: string): boolean;
56
+ /** Error al modelo de las dos protecciones en `preparar` (null = se puede). */
57
+ export declare function proteccionAlPreparar(ctx: ActionPrepareContext, usuarios: readonly OrgUser[], persona: OrgUser, acceso: Acceso, quitaAdmin: boolean): string | null;
58
+ /**
59
+ * Las mismas protecciones al confirmar, con la lista del momento. Si alguna ya no
60
+ * se cumple, lanza `AccionRechazada` con el texto al cliente (no se hace nada y
61
+ * queda `failed`); si no, devuelve el `rol_id` ya comprobado. Un rol que ya no está en la lista también se para aquí: el
62
+ * backend no da 404 sino 403 («Organization could not be resolved», porque saca
63
+ * la organización del propio rol) y se traduciría como «no tienes permiso».
64
+ */
65
+ export declare function proteccionAlEjecutar(gateway: PatrolTechGateway, ctx: ActionContext, p: {
66
+ usuario: string;
67
+ usuario_id?: string;
68
+ rol_id?: string;
69
+ }, quitaAdmin: boolean): Promise<string>;
70
+ /** «al acceso de toda la organización» / «a la ubicación «X»», para el resumen del cambio de rol. */
71
+ export declare function accesoA(idioma: FixedTextLanguage, ubicacion: string | undefined): string;
72
+ //# sourceMappingURL=user-access.d.ts.map