@jantstack/adonis-authz 2.0.0-alpha.1 → 2.4.0-alpha.10

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 (224) hide show
  1. package/README.md +934 -40
  2. package/build/commands/authz_catalog_diff.d.ts.map +1 -1
  3. package/build/commands/authz_catalog_diff.js +1 -2
  4. package/build/commands/authz_catalog_diff.js.map +1 -1
  5. package/build/commands/authz_catalog_prune_orphans.d.ts +78 -0
  6. package/build/commands/authz_catalog_prune_orphans.d.ts.map +1 -0
  7. package/build/commands/authz_catalog_prune_orphans.js +135 -0
  8. package/build/commands/authz_catalog_prune_orphans.js.map +1 -0
  9. package/build/commands/authz_catalog_sync.d.ts +17 -0
  10. package/build/commands/authz_catalog_sync.d.ts.map +1 -1
  11. package/build/commands/authz_catalog_sync.js +27 -4
  12. package/build/commands/authz_catalog_sync.js.map +1 -1
  13. package/build/commands/authz_freeze.d.ts +44 -0
  14. package/build/commands/authz_freeze.d.ts.map +1 -0
  15. package/build/commands/authz_freeze.js +94 -0
  16. package/build/commands/authz_freeze.js.map +1 -0
  17. package/build/commands/authz_reconcile.d.ts +111 -0
  18. package/build/commands/authz_reconcile.d.ts.map +1 -0
  19. package/build/commands/authz_reconcile.js +417 -0
  20. package/build/commands/authz_reconcile.js.map +1 -0
  21. package/build/commands/authz_relations_reconcile.d.ts +144 -0
  22. package/build/commands/authz_relations_reconcile.d.ts.map +1 -0
  23. package/build/commands/authz_relations_reconcile.js +438 -0
  24. package/build/commands/authz_relations_reconcile.js.map +1 -0
  25. package/build/commands/authz_scopes_relay.d.ts +97 -0
  26. package/build/commands/authz_scopes_relay.d.ts.map +1 -0
  27. package/build/commands/authz_scopes_relay.js +344 -0
  28. package/build/commands/authz_scopes_relay.js.map +1 -0
  29. package/build/commands/authz_scopes_requeue.d.ts +80 -0
  30. package/build/commands/authz_scopes_requeue.d.ts.map +1 -0
  31. package/build/commands/authz_scopes_requeue.js +230 -0
  32. package/build/commands/authz_scopes_requeue.js.map +1 -0
  33. package/build/commands/authz_unfreeze.d.ts +45 -0
  34. package/build/commands/authz_unfreeze.d.ts.map +1 -0
  35. package/build/commands/authz_unfreeze.js +157 -0
  36. package/build/commands/authz_unfreeze.js.map +1 -0
  37. package/build/commands/main.d.ts +16 -8
  38. package/build/commands/main.d.ts.map +1 -1
  39. package/build/commands/main.js +59 -6
  40. package/build/commands/main.js.map +1 -1
  41. package/build/commands/openfga_provision.d.ts +92 -4
  42. package/build/commands/openfga_provision.d.ts.map +1 -1
  43. package/build/commands/openfga_provision.js +155 -7
  44. package/build/commands/openfga_provision.js.map +1 -1
  45. package/build/configure.d.ts +11 -0
  46. package/build/configure.d.ts.map +1 -1
  47. package/build/configure.js +37 -1
  48. package/build/configure.js.map +1 -1
  49. package/build/index.d.ts +50 -11
  50. package/build/index.d.ts.map +1 -1
  51. package/build/index.js +49 -7
  52. package/build/index.js.map +1 -1
  53. package/build/providers/authz_provider.d.ts +31 -2
  54. package/build/providers/authz_provider.d.ts.map +1 -1
  55. package/build/providers/authz_provider.js +65 -2
  56. package/build/providers/authz_provider.js.map +1 -1
  57. package/build/services/relations.d.ts +14 -0
  58. package/build/services/relations.d.ts.map +1 -0
  59. package/build/services/relations.js +17 -0
  60. package/build/services/relations.js.map +1 -0
  61. package/build/src/{catalog.d.ts → catalog/catalog.d.ts} +41 -2
  62. package/build/src/catalog/catalog.d.ts.map +1 -0
  63. package/build/src/{catalog.js → catalog/catalog.js} +120 -14
  64. package/build/src/catalog/catalog.js.map +1 -0
  65. package/build/src/{catalog_cache.d.ts → catalog/catalog_cache.d.ts} +46 -22
  66. package/build/src/catalog/catalog_cache.d.ts.map +1 -0
  67. package/build/src/{catalog_cache.js → catalog/catalog_cache.js} +53 -43
  68. package/build/src/catalog/catalog_cache.js.map +1 -0
  69. package/build/src/define_config.d.ts +206 -3
  70. package/build/src/define_config.d.ts.map +1 -1
  71. package/build/src/define_config.js +11 -0
  72. package/build/src/define_config.js.map +1 -1
  73. package/build/src/drivers/database_driver.d.ts +128 -7
  74. package/build/src/drivers/database_driver.d.ts.map +1 -1
  75. package/build/src/drivers/database_driver.js +510 -24
  76. package/build/src/drivers/database_driver.js.map +1 -1
  77. package/build/src/drivers/database_relations_driver.d.ts +140 -0
  78. package/build/src/drivers/database_relations_driver.d.ts.map +1 -0
  79. package/build/src/drivers/database_relations_driver.js +748 -0
  80. package/build/src/drivers/database_relations_driver.js.map +1 -0
  81. package/build/src/drivers/openfga_driver.d.ts +777 -122
  82. package/build/src/drivers/openfga_driver.d.ts.map +1 -1
  83. package/build/src/drivers/openfga_driver.js +2228 -477
  84. package/build/src/drivers/openfga_driver.js.map +1 -1
  85. package/build/src/drivers/openfga_facts.d.ts +384 -0
  86. package/build/src/drivers/openfga_facts.d.ts.map +1 -0
  87. package/build/src/drivers/openfga_facts.js +836 -0
  88. package/build/src/drivers/openfga_facts.js.map +1 -0
  89. package/build/src/drivers/openfga_relations_driver.d.ts +186 -0
  90. package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -0
  91. package/build/src/drivers/openfga_relations_driver.js +724 -0
  92. package/build/src/drivers/openfga_relations_driver.js.map +1 -0
  93. package/build/src/errors.d.ts +430 -6
  94. package/build/src/errors.d.ts.map +1 -1
  95. package/build/src/errors.js +453 -6
  96. package/build/src/errors.js.map +1 -1
  97. package/build/src/freeze.d.ts +200 -0
  98. package/build/src/freeze.d.ts.map +1 -0
  99. package/build/src/freeze.js +306 -0
  100. package/build/src/freeze.js.map +1 -0
  101. package/build/src/http/app_access_middleware.d.ts.map +1 -0
  102. package/build/src/http/app_access_middleware.js.map +1 -0
  103. package/build/src/http/resource_access_middleware.d.ts +105 -0
  104. package/build/src/http/resource_access_middleware.d.ts.map +1 -0
  105. package/build/src/http/resource_access_middleware.js +81 -0
  106. package/build/src/http/resource_access_middleware.js.map +1 -0
  107. package/build/src/identity.d.ts +74 -1
  108. package/build/src/identity.d.ts.map +1 -1
  109. package/build/src/identity.js +100 -2
  110. package/build/src/identity.js.map +1 -1
  111. package/build/src/manager.d.ts +549 -6
  112. package/build/src/manager.d.ts.map +1 -1
  113. package/build/src/manager.js +2243 -193
  114. package/build/src/manager.js.map +1 -1
  115. package/build/src/models/authz_assignment.d.ts +7 -7
  116. package/build/src/models/authz_assignment.d.ts.map +1 -1
  117. package/build/src/models/authz_deny.d.ts +7 -7
  118. package/build/src/models/authz_deny.d.ts.map +1 -1
  119. package/build/src/models/authz_permission.d.ts +7 -7
  120. package/build/src/models/authz_permission.d.ts.map +1 -1
  121. package/build/src/models/authz_role.d.ts +7 -7
  122. package/build/src/models/authz_role.d.ts.map +1 -1
  123. package/build/src/models/authz_role_permission.d.ts +7 -7
  124. package/build/src/models/authz_role_permission.d.ts.map +1 -1
  125. package/build/src/openfga.d.ts +18 -2
  126. package/build/src/openfga.d.ts.map +1 -1
  127. package/build/src/openfga.js +15 -1
  128. package/build/src/openfga.js.map +1 -1
  129. package/build/src/reconcile.d.ts +37 -0
  130. package/build/src/reconcile.d.ts.map +1 -0
  131. package/build/src/reconcile.js +69 -0
  132. package/build/src/reconcile.js.map +1 -0
  133. package/build/src/relation_partition_trigger.d.ts +8 -0
  134. package/build/src/relation_partition_trigger.d.ts.map +1 -0
  135. package/build/src/relation_partition_trigger.js +93 -0
  136. package/build/src/relation_partition_trigger.js.map +1 -0
  137. package/build/src/relations/define_relations_config.d.ts +109 -0
  138. package/build/src/relations/define_relations_config.d.ts.map +1 -0
  139. package/build/src/relations/define_relations_config.js +211 -0
  140. package/build/src/relations/define_relations_config.js.map +1 -0
  141. package/build/src/relations/manager.d.ts +138 -0
  142. package/build/src/relations/manager.d.ts.map +1 -0
  143. package/build/src/relations/manager.js +494 -0
  144. package/build/src/relations/manager.js.map +1 -0
  145. package/build/src/relations/reconcile.d.ts +137 -0
  146. package/build/src/relations/reconcile.d.ts.map +1 -0
  147. package/build/src/relations/reconcile.js +294 -0
  148. package/build/src/relations/reconcile.js.map +1 -0
  149. package/build/src/relations_config_store.d.ts +22 -0
  150. package/build/src/relations_config_store.d.ts.map +1 -0
  151. package/build/src/relations_config_store.js +74 -0
  152. package/build/src/relations_config_store.js.map +1 -0
  153. package/build/src/scope_outbox.d.ts +123 -0
  154. package/build/src/scope_outbox.d.ts.map +1 -0
  155. package/build/src/scope_outbox.js +532 -0
  156. package/build/src/scope_outbox.js.map +1 -0
  157. package/build/src/{drivers → shared}/backend_guard.d.ts +42 -0
  158. package/build/src/shared/backend_guard.d.ts.map +1 -0
  159. package/build/src/{drivers → shared}/backend_guard.js +78 -1
  160. package/build/src/shared/backend_guard.js.map +1 -0
  161. package/build/src/{drivers → shared}/sql_expiry.d.ts +2 -0
  162. package/build/src/shared/sql_expiry.d.ts.map +1 -0
  163. package/build/src/{drivers → shared}/sql_expiry.js +4 -0
  164. package/build/src/shared/sql_expiry.js.map +1 -0
  165. package/build/src/shared/transaction_guard.d.ts +53 -0
  166. package/build/src/shared/transaction_guard.d.ts.map +1 -0
  167. package/build/src/shared/transaction_guard.js +74 -0
  168. package/build/src/shared/transaction_guard.js.map +1 -0
  169. package/build/src/sql_descendants.d.ts +55 -1
  170. package/build/src/sql_descendants.d.ts.map +1 -1
  171. package/build/src/sql_descendants.js +75 -1
  172. package/build/src/sql_descendants.js.map +1 -1
  173. package/build/src/testing/contract.d.ts +129 -4
  174. package/build/src/testing/contract.d.ts.map +1 -1
  175. package/build/src/testing/contract.js +915 -177
  176. package/build/src/testing/contract.js.map +1 -1
  177. package/build/src/testing/main.d.ts +10 -2
  178. package/build/src/testing/main.d.ts.map +1 -1
  179. package/build/src/testing/main.js +5 -1
  180. package/build/src/testing/main.js.map +1 -1
  181. package/build/src/testing/migration_contract.d.ts +293 -0
  182. package/build/src/testing/migration_contract.d.ts.map +1 -0
  183. package/build/src/testing/migration_contract.js +589 -0
  184. package/build/src/testing/migration_contract.js.map +1 -0
  185. package/build/src/testing/relations_contract.d.ts +73 -0
  186. package/build/src/testing/relations_contract.d.ts.map +1 -0
  187. package/build/src/testing/relations_contract.js +1238 -0
  188. package/build/src/testing/relations_contract.js.map +1 -0
  189. package/build/src/testing/relations_reconcile_contract.d.ts +24 -0
  190. package/build/src/testing/relations_reconcile_contract.d.ts.map +1 -0
  191. package/build/src/testing/relations_reconcile_contract.js +220 -0
  192. package/build/src/testing/relations_reconcile_contract.js.map +1 -0
  193. package/build/src/testing/scope_outbox_contract.d.ts +98 -0
  194. package/build/src/testing/scope_outbox_contract.d.ts.map +1 -0
  195. package/build/src/testing/scope_outbox_contract.js +677 -0
  196. package/build/src/testing/scope_outbox_contract.js.map +1 -0
  197. package/build/src/traits/authz_scopes.js +1 -1
  198. package/build/src/traits/authz_scopes.js.map +1 -1
  199. package/build/src/traits/has_uuid.d.ts +8 -8
  200. package/build/src/traits/has_uuid.d.ts.map +1 -1
  201. package/build/src/types.d.ts +1537 -84
  202. package/build/src/types.d.ts.map +1 -1
  203. package/build/src/types.js +65 -0
  204. package/build/src/types.js.map +1 -1
  205. package/build/stubs/config/authorization.stub +149 -5
  206. package/build/stubs/migration.stub +136 -0
  207. package/build/stubs/scopes_outbox_migration.stub +57 -0
  208. package/package.json +4 -2
  209. package/build/commands/openfga_import.d.ts +0 -34
  210. package/build/commands/openfga_import.d.ts.map +0 -1
  211. package/build/commands/openfga_import.js +0 -97
  212. package/build/commands/openfga_import.js.map +0 -1
  213. package/build/src/catalog.d.ts.map +0 -1
  214. package/build/src/catalog.js.map +0 -1
  215. package/build/src/catalog_cache.d.ts.map +0 -1
  216. package/build/src/catalog_cache.js.map +0 -1
  217. package/build/src/drivers/backend_guard.d.ts.map +0 -1
  218. package/build/src/drivers/backend_guard.js.map +0 -1
  219. package/build/src/drivers/sql_expiry.d.ts.map +0 -1
  220. package/build/src/drivers/sql_expiry.js.map +0 -1
  221. package/build/src/middleware/app_access_middleware.d.ts.map +0 -1
  222. package/build/src/middleware/app_access_middleware.js.map +0 -1
  223. /package/build/src/{middleware → http}/app_access_middleware.d.ts +0 -0
  224. /package/build/src/{middleware → http}/app_access_middleware.js +0 -0
@@ -0,0 +1,417 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { BaseCommand, flags } from '@adonisjs/core/ace';
11
+ /**
12
+ * Las líneas del reporte y si la pasada es «limpia», en una función PURA
13
+ * (mismo patrón que `orphanLines`): es lo único del comando que decide algo,
14
+ * y así tiene su caso sin montar un ace.
15
+ *
16
+ * Qué cuenta como deriva —y por tanto como exit ≠ 0—:
17
+ * - en `--dry-run`, **cualquier cosa que la pasada haría** (escribir,
18
+ * actualizar o borrar): es el verificador, y para eso está en CI;
19
+ * - siempre, lo que una pasada NO puede arreglar sola: **ciclos** en el
20
+ * árbol del consumidor, **entradas aparcadas** de la outbox, **cadenas
21
+ * por encima del techo de profundidad** (`drift.tooDeep`, alpha.5 · R0: un
22
+ * 503 esperando en `facts`) y hechos que se quedan fuera (`skipped`) —
23
+ * incluidos los del scope que ya no resuelve, que solo se van con
24
+ * `--prune`.
25
+ *
26
+ * La ventana del relay (`pendingRelay`) se AVISA pero no tumba la pasada: es
27
+ * una ventana de segundos por diseño, no una divergencia. **Y lo AJENO de un
28
+ * store compartido tampoco** (2.4.0-alpha.9 · B): esas tuplas tienen otro
29
+ * dueño, se imprimen con su tipo y jamás son deriva — contarlas dejaba
30
+ * `clean = false` para siempre en cualquier despliegue con relaciones. Y **`expired`
31
+ * tampoco tumba** (3b-8 · B2): es la pérdida DECLARADA de la migración, no
32
+ * concede en ningún driver y nada barre las filas caducadas del origen, así
33
+ * que contarla como deriva dejaba el exit 1 clavado para siempre a la
34
+ * primera caducidad real.
35
+ */
36
+ export function reconcileLines(report) {
37
+ const lines = [];
38
+ const fase = (nombre, key) => {
39
+ const c = report.phases[key];
40
+ if (c.written + c.updated + c.unchanged + c.extra + c.deleted === 0)
41
+ return;
42
+ lines.push({
43
+ level: 'log',
44
+ message: `${nombre}: escritas ${c.written}, actualizadas ${c.updated}, iguales ${c.unchanged}, ` +
45
+ `sobran ${c.extra}, borradas ${c.deleted}`,
46
+ });
47
+ };
48
+ // **De dónde salieron los hechos** (3b-5), lo primero: es la diferencia
49
+ // entre una MIGRACIÓN y una pasada de mantenimiento contra el driver
50
+ // activo, y con ella se leen todos los números de abajo.
51
+ if (report.factsFrom !== undefined) {
52
+ lines.push(report.factsFrom === report.to
53
+ ? {
54
+ level: 'log',
55
+ message: `hechos: los del propio '${report.to}' — es el driver ACTIVO, así que sus hechos son SUYOS y no ` +
56
+ `los de authz_assignments/authz_denies. Esta pasada rehace lo derivado (marcador de raíz, ` +
57
+ `proyección del catálogo, árbol y visibilidad de rol) y no escribe hechos; con --prune borra los de ` +
58
+ `scopes que ya no resuelven, los caducados, los de roles o permisos que el catálogo o el modelo ya no ` +
59
+ `tienen (y los que sobran). ` +
60
+ `Si lo que quieres es MIGRAR desde las tablas, nómbralas: --from=<driver cuyos hechos son authz_*>.`,
61
+ }
62
+ : { level: 'log', message: `hechos: leídos de ${report.factsFrom}` });
63
+ }
64
+ // **La dirección RANCIA** (2.4.0-alpha.10): destino = el driver ACTIVO,
65
+ // origen = otro. Sin `--allow-stale-source` solo llega aquí un `--dry-run`
66
+ // (la pasada que escribe es 500 en el manager) y es DERIVA: una pasada así
67
+ // resucitaría lo revocado desde el cutover.
68
+ if (report.staleSource !== undefined) {
69
+ const { to, from, allowed } = report.staleSource;
70
+ lines.push({
71
+ level: 'warning',
72
+ message: `dirección RANCIA: '${to}' es el driver ACTIVO y los hechos salen de '${from}', que dejó de verlos en el ` +
73
+ 'cutover — esta pasada re-escribe en el driver activo lo que el origen ya no refleja (resucita las ' +
74
+ 'revocaciones hechas desde entonces). ' +
75
+ (allowed
76
+ ? 'Levantada a sabiendas con --allow-stale-source.'
77
+ : `Sin --allow-stale-source la pasada de verdad se niega (E_AUTHZ_STALE_SOURCE_REFUSED); para verificar ` +
78
+ `el driver activo, la pasada de mantenimiento es sin --from: authz:reconcile --to=${to} --dry-run.`),
79
+ });
80
+ }
81
+ fase('marcador de raíz', 'root');
82
+ fase('proyección del catálogo', 'catalog');
83
+ fase('árbol', 'tree');
84
+ fase('hechos', 'facts');
85
+ for (const skip of report.details) {
86
+ lines.push({ level: 'warning', message: `sin migrar (${skip.reason}) ${skip.kind}: ${skip.detail}` });
87
+ }
88
+ const motivos = Object.entries(report.skipped).sort(([a], [b]) => (a < b ? -1 : 1));
89
+ for (const [reason, count] of motivos) {
90
+ lines.push({ level: 'warning', message: `${count} sin migrar por '${reason}'` });
91
+ }
92
+ if (report.skipped['unknown-scope'] && !report.prune) {
93
+ lines.push({
94
+ level: 'warning',
95
+ message: 'Los hechos de un scope que YA NO RESUELVE siguen en el destino y volverían a conceder si el scope se ' +
96
+ 'restaura con el mismo uuid: repite con --prune para borrarlos.',
97
+ });
98
+ }
99
+ if (report.drift.rootMarker) {
100
+ lines.push({
101
+ level: 'error',
102
+ message: 'Faltaba el MARCADOR DE RAÍZ (scope:app#rooted): sin él el store entero deniega, en silencio. ' +
103
+ 'Lo repone esta pasada y cada authz:catalog:sync.',
104
+ });
105
+ }
106
+ for (const object of report.drift.multiParent) {
107
+ lines.push({
108
+ level: 'error',
109
+ message: `${object} tenía MÁS DE UN PADRE en el destino: había otro escritor del árbol. Esta pasada lo deja con el del consumidor.`,
110
+ });
111
+ }
112
+ if (report.drift.roleVisibility > 0) {
113
+ lines.push({
114
+ level: 'error',
115
+ message: `${report.drift.roleVisibility} arista(s) de visibilidad de rol (invariante 18) estaban mal en el destino: ` +
116
+ 'una escritura que el relay pudo perder. Con la de MÁS, el destino concedía lo que el catálogo y el árbol de hoy no.',
117
+ });
118
+ }
119
+ for (const cycle of report.cycles) {
120
+ lines.push({
121
+ level: 'error',
122
+ message: `CICLO en el árbol del consumidor: ${cycle.join(' → ')} → ${cycle[0]}. Ninguna de sus aristas se escribe ` +
123
+ '(el backend evalúa el ciclo y la herencia pasa a ser bidireccional), así que ese subárbol DENIEGA hasta que lo arregles.',
124
+ });
125
+ }
126
+ // **El store COMPARTIDO** (2.4.0-alpha.9 · B). Con `openfga` las tuplas de
127
+ // `relations/` viven en el mismo store y esta pasada las VE: se dice en voz
128
+ // alta —con los tipos, que es lo único que permite reconocer uno que ya no
129
+ // se declara—, no se cuentan como deriva y no se tocan ni con `--prune`.
130
+ // Antes caían en `extra` y `--prune` las borraba (60 de 60 medidas),
131
+ // reportando `clean = true`: el verde MUDO de una pasada destructiva.
132
+ const foreign = report.foreign;
133
+ if (foreign !== undefined && foreign.tuples > 0) {
134
+ const porTipo = Object.entries(foreign.types)
135
+ .sort(([a], [b]) => (a < b ? -1 : 1))
136
+ .map(([type, count]) => `${type} (${count})`)
137
+ .join(', ');
138
+ lines.push({
139
+ level: 'log',
140
+ message: `ajenas: ${foreign.tuples} tupla(s) de tipos que esta pasada NO gobierna [${porTipo}] — el store está ` +
141
+ 'COMPARTIDO con otro subsistema (las relaciones de relations/, o un modelo anterior de otro dueño): ' +
142
+ 'ni se borran, ni cuentan como deriva.',
143
+ });
144
+ if (report.prune) {
145
+ lines.push({
146
+ level: 'log',
147
+ message: `--prune ha respetado ${foreign.tuples} tupla(s) ajenas: solo borra lo de esta pasada.`,
148
+ });
149
+ }
150
+ if (foreign.relations !== undefined && (foreign.unknown ?? 0) > 0) {
151
+ lines.push({
152
+ level: 'warning',
153
+ message: `${foreign.unknown} de esas tuplas no las reclama nadie: no son de esta pasada y su tipo tampoco está ` +
154
+ 'declarado en relations.config (un modelo anterior de otro subsistema, o un tipo que se retiró). ' +
155
+ 'Este paquete ya no las barre: míralas a mano.',
156
+ });
157
+ }
158
+ }
159
+ if (report.drift.pendingRelay > 0) {
160
+ lines.push({
161
+ level: 'warning',
162
+ message: `${report.drift.pendingRelay} cambio(s) del árbol encolados y sin relevar: el destino decide con el árbol VIEJO ` +
163
+ 'en esa ventana. Drena la cola (authz:scopes:relay) y repite si quieres una foto sin ventana.',
164
+ });
165
+ }
166
+ if (report.drift.deadRelay > 0) {
167
+ lines.push({
168
+ level: 'error',
169
+ message: `${report.drift.deadRelay} cambio(s) del árbol APARCADOS en la outbox: eso no es una ventana, es divergencia permanente.`,
170
+ });
171
+ }
172
+ for (const scope of report.drift.tooDeep ?? []) {
173
+ lines.push({
174
+ level: 'error',
175
+ message: `${scope} está a MÁS de ${report.drift.tooDeepLimit ?? '?'} saltos de app: el modelo facts no resuelve esa cadena de ` +
176
+ 'forma fiable (authorize responde 503, nunca false, para todo ese subárbol). Es legal en database y una caída en ' +
177
+ 'openfga. Aplana el árbol, o declara scopes.maxDepth (y sube OPENFGA_RESOLVE_NODE_LIMIT en el servidor).',
178
+ });
179
+ }
180
+ // alpha.10 · 3: la ventana del OPERADOR adoptada dice si caduca y cuándo
181
+ // (antes el reporte la daba por eterna aunque se abriese con --lease-ms).
182
+ // alpha.10 · S2: y SIEMPRE en qué ventana corrió — la del operador y una
183
+ // propia eran letra a letra iguales, y «tomé mi ventana porque no había
184
+ // ninguna» es lo que delata un cutover cuya ventana ya no estaba.
185
+ if (report.frozen !== undefined && !report.frozen.lapsed && report.frozen.window === 'own') {
186
+ lines.push({
187
+ level: 'warning',
188
+ message: `La pasada tomó SU PROPIA ventana (fence ${report.frozen.fence}, lease ${report.frozen.leaseMs} ms) y la soltó al ` +
189
+ 'terminar: NO había ventana de operador viva. Si esta pasada era parte de un cutover, la flota vuelve a escribir ' +
190
+ 'ya — abre la ventana con authz:freeze antes de cambiar de driver.',
191
+ });
192
+ }
193
+ if (report.frozen !== undefined && !report.frozen.lapsed && report.frozen.window === 'enclosing') {
194
+ lines.push({
195
+ level: 'log',
196
+ message: `La pasada corrió dentro de la ventana que ya sostenía este proceso (fence ${report.frozen.fence}).`,
197
+ });
198
+ }
199
+ if (report.frozen !== undefined && report.frozen.untilMs !== undefined && !report.frozen.lapsed) {
200
+ lines.push(report.frozen.untilMs === null
201
+ ? {
202
+ level: 'log',
203
+ message: `La pasada corrió dentro de la ventana del operador (fence ${report.frozen.fence}), sin caducidad.`,
204
+ }
205
+ : {
206
+ level: 'warning',
207
+ message: `La pasada corrió dentro de la ventana del operador (fence ${report.frozen.fence}), que CADUCA el ` +
208
+ `${new Date(report.frozen.untilMs).toISOString()} (le quedaban ${report.frozen.leaseMs} ms al empezar): ` +
209
+ 'si el cutover no termina antes, las escrituras vuelven solas — ciérrala con authz:unfreeze.',
210
+ });
211
+ }
212
+ if (report.frozen?.lapsed) {
213
+ lines.push({
214
+ level: 'error',
215
+ message: 'El LEASE del freeze se perdió a MITAD de la pasada (una pausa más larga que el lease, la base caída, o ' +
216
+ 'alguien levantó la ventana): hubo un intervalo en el que otros procesos pudieron escribir, y lo que ' +
217
+ 'escribieran no está en ningún contador. La pasada NO se certifica: repítela dentro de una ventana entera.',
218
+ });
219
+ }
220
+ if (report.massDelete) {
221
+ lines.push({
222
+ level: 'error',
223
+ message: report.to === 'database'
224
+ ? 'Esta pasada borraría hechos y el ORIGEN no ha devuelto NI UNO: comprueba el --from y el store antes de ' +
225
+ 'usar --allow-mass-delete.'
226
+ : `Esta pasada borraría hechos y el ORIGEN (${report.factsFrom ?? 'authz_assignments/authz_denies'}) no ha ` +
227
+ 'devuelto NI UNO: comprueba la conexión y qué driver está escribiendo los hechos antes de usar ' +
228
+ '--allow-mass-delete.',
229
+ });
230
+ }
231
+ const cambios = report.written + report.updated + report.deleted;
232
+ // **`expired` no es deriva** (3b-8 · B2). Es la ÚNICA pérdida DECLARADA de
233
+ // la migración (README, contrato de migración): una asignación caducada no
234
+ // concede en ningún driver (invariante 3), no hay scheduler que barra sus
235
+ // filas del ORIGEN (a propósito) y ninguna escritura en el DESTINO puede
236
+ // «arreglarla». Contarla como deriva hacía el verde del verificador
237
+ // INALCANZABLE con datos reales: a la primera caducidad, exit 1 para
238
+ // siempre — el CI que el CHANGELOG promete verde no existía. Sigue saliendo
239
+ // contada («N sin migrar por 'expired'»); lo que no hace es tumbar la
240
+ // pasada. Las caducadas que SOBRAN en el destino sí son deriva
241
+ // (`extra-fact`), y su barrido existe: `--prune`.
242
+ const drifting = Object.keys(report.skipped).filter((reason) => reason !== 'expired');
243
+ const clean = report.cycles.length === 0 &&
244
+ report.drift.deadRelay === 0 &&
245
+ report.drift.multiParent.length === 0 &&
246
+ // Una cadena por encima del techo es un 503 esperando (alpha.5 · R0): deriva.
247
+ (report.drift.tooDeep?.length ?? 0) === 0 &&
248
+ drifting.length === 0 &&
249
+ // La garantía del freeze se DEMUESTRA (3b-7, juez C4): un lease perdido a
250
+ // mitad es una ventana en la que otros pudieron escribir ⇒ exit ≠ 0.
251
+ report.frozen?.lapsed !== true &&
252
+ // La dirección rancia en el verificador es deriva (2.4.0-alpha.10): la
253
+ // pasada que certificaría haría daño.
254
+ !(report.dryRun && report.staleSource !== undefined && !report.staleSource.allowed) &&
255
+ (!report.dryRun || cambios === 0);
256
+ return { lines, clean };
257
+ }
258
+ /**
259
+ * **Migra —y verifica— entre drivers** (3b-3a). Es la única primitiva de
260
+ * migración del paquete: `openfga:import` se borró en 3b-2k · K2 porque
261
+ * llenaba el store con las tuplas de un modelo que ya no existe.
262
+ *
263
+ * node ace authz:reconcile --to=openfga --dry-run # el VERIFICADOR (CI)
264
+ * node ace authz:reconcile --to=openfga # migra, o MANTIENE (ver abajo)
265
+ * node ace authz:reconcile --to=openfga --prune # y borra lo que el origen ya no respalda
266
+ *
267
+ * `--to` nombra una clave de `drivers` en `config/authorization.ts`, no el
268
+ * driver activo: migrar es llenar el destino mientras el motor sigue
269
+ * corriendo con el otro.
270
+ *
271
+ * **De dónde salen los HECHOS** (3b-5): de quien sea su fuente de verdad, y
272
+ * la pasada lo dice en su primera línea (`report.factsFrom`).
273
+ * - Si `--to` es el driver ACTIVO y sus hechos viven en su backend
274
+ * (`capabilities.hierarchyFacts`, el `openfga` de esta versión), los
275
+ * hechos son los SUYOS: la pasada es de MANTENIMIENTO —rehace lo derivado
276
+ * y aplica el barrido de visibilidad del invariante 18— y no escribe
277
+ * hechos; con `--prune` borra los de scopes que ya no resuelven, los
278
+ * caducados y los de roles/permisos retirados (y los que sobran) —
279
+ * alpha.10: hasta alpha.9 esta línea decía que no borraba ningún hecho y con
280
+ * `--prune` los borraba. `authz_assignments`/`authz_denies` no son su
281
+ * fuente: después de un cutover a `facts` están congeladas, y
282
+ * reconstruir desde ellas resucitaba lo revocado y —con `--prune`—
283
+ * borraba los denies vivos.
284
+ * - Con `--from=<driver>` mandas tú: si ese driver es el `database` del
285
+ * paquete, los hechos son sus tablas y `--to=openfga` es la MIGRACIÓN de
286
+ * un solo sentido de siempre.
287
+ *
288
+ * Qué migra hacia `openfga`: el marcador de raíz, la proyección del catálogo,
289
+ * el árbol (desde `scopes.enumerateEdges`) y los hechos de `authz_*`.
290
+ *
291
+ * Qué migra hacia `database` (3b-3b, la VUELTA): **solo los hechos**, leídos
292
+ * del origen por el puerto `enumerateFacts` (páginas con cursor). El ÁRBOL no
293
+ * se migra —el driver `database` lo lee de tus tablas en cada pregunta, que
294
+ * son su fuente de verdad— y el CATÁLOGO tampoco, que es propiedad local
295
+ * siempre. Por eso en esa dirección las fases `marcador de raíz`,
296
+ * `proyección del catálogo` y `árbol` son cero: no hay nada derivado que
297
+ * rehacer, y el cero lo dice.
298
+ *
299
+ * El origen se elige solo si es inequívoco: con dos drivers registrados es el
300
+ * que no es el destino; con más de un candidato hay que decirlo con
301
+ * `--from=<driver>`, porque de dónde salen los hechos decide lo que va a
302
+ * quedar escrito.
303
+ *
304
+ * Las dos direcciones son IDEMPOTENTES (la segunda pasada escribe cero),
305
+ * reanudables (leen por lotes con cursor y convergen si se repiten) y **nunca
306
+ * silenciosas**: cada cosa que no se migra sale contada y con su motivo.
307
+ *
308
+ * `--dry-run` es el verificador y es **read-only por contrato** (panel 2,
309
+ * cruce 4 · S18): mismo recorrido, cero escrituras y los mismos números. **No
310
+ * hay ni habrá un `--fix`**: sería un mecanismo de concesión.
311
+ *
312
+ * Durante la pasada que ESCRIBE, las escrituras del motor están congeladas
313
+ * (503 reintentable) y las lecturas siguen. **Con `--dry-run` NO se congela**
314
+ * (3b-6): el verificador no escribe nada, así que no tiene nada que proteger,
315
+ * y está publicado para correrlo en CI y en un cron — justo el sitio desde el
316
+ * que un mecanismo de indisponibilidad se dispara solo. Es una operación de
317
+ * PLATAFORMA: no lleva actor, no mide rangos y no se expone por HTTP.
318
+ */
319
+ export default class AuthzReconcile extends BaseCommand {
320
+ static commandName = 'authz:reconcile';
321
+ static description = 'Rebuild (or verify, with --dry-run) a driver from the authz_* tables and the consumer scope tree';
322
+ static options = {
323
+ startApp: true,
324
+ };
325
+ async run() {
326
+ if (!this.to) {
327
+ this.logger.error("Falta --to: 'node ace authz:reconcile --to=openfga'. Es la clave del driver DESTINO en " +
328
+ 'config/authorization.ts, no el driver activo.');
329
+ this.exitCode = 1;
330
+ return;
331
+ }
332
+ const { default: authorization } = await import('../services/main.js');
333
+ let report;
334
+ try {
335
+ report = await authorization.reconcile({
336
+ to: this.to,
337
+ ...(this.from !== undefined ? { from: this.from } : {}),
338
+ dryRun: this.dryRun === true,
339
+ prune: this.prune === true,
340
+ allowMassDelete: this.allowMassDelete === true,
341
+ allowStaleSource: this.allowStaleSource === true,
342
+ batchSize: this.batchSize,
343
+ maxTuples: this.maxTuples,
344
+ });
345
+ }
346
+ catch (error) {
347
+ // La dirección rancia (2.4.0-alpha.10) es una negativa con letra, no un
348
+ // stack: el mensaje ya nombra la dirección, el riesgo y la salida.
349
+ if (error?.code === 'E_AUTHZ_STALE_SOURCE_REFUSED' || error?.code === 'E_AUTHZ_OPERATOR_WINDOW_EXPIRED') {
350
+ this.logger.error(String(error.message));
351
+ this.exitCode = 1;
352
+ return;
353
+ }
354
+ throw error;
355
+ }
356
+ const { lines, clean } = reconcileLines(report);
357
+ for (const { level, message } of lines)
358
+ this.logger[level](message);
359
+ const resumen = `escritas ${report.written}, actualizadas ${report.updated}, iguales ${report.unchanged}, ` +
360
+ `sobran ${report.extra}, borradas ${report.deleted}`;
361
+ if (report.dryRun) {
362
+ if (clean) {
363
+ this.logger.success(`Sin deriva: '${this.to}' coincide con ${report.factsFrom ?? 'authz_*'} y con tu árbol (${resumen}).`);
364
+ return;
365
+ }
366
+ this.logger.error(`DERIVA con '${this.to}': ${resumen}. No se ha escrito nada (--dry-run).`);
367
+ this.exitCode = 1;
368
+ return;
369
+ }
370
+ this.logger.success(`'${this.to}' reconciliado: ${resumen}.`);
371
+ if (!clean) {
372
+ this.logger.warning('Queda algo que esta pasada no arregla sola (mira las líneas de arriba): repítela cuando lo hayas resuelto.');
373
+ this.exitCode = 1;
374
+ }
375
+ }
376
+ }
377
+ __decorate([
378
+ flags.string({ description: 'Destination driver: a key of `drivers` in config/authorization.ts' }),
379
+ __metadata("design:type", Object)
380
+ ], AuthzReconcile.prototype, "to", void 0);
381
+ __decorate([
382
+ flags.string({
383
+ description: 'Source driver (a key of `drivers`). Only needed when more than one registered driver can be the source',
384
+ }),
385
+ __metadata("design:type", Object)
386
+ ], AuthzReconcile.prototype, "from", void 0);
387
+ __decorate([
388
+ flags.boolean({ description: 'Report what it would do and write nothing (this is the verifier)' }),
389
+ __metadata("design:type", Object)
390
+ ], AuthzReconcile.prototype, "dryRun", void 0);
391
+ __decorate([
392
+ flags.boolean({ description: 'Also delete the facts the source no longer backs (dead scopes, leftovers)' }),
393
+ __metadata("design:type", Object)
394
+ ], AuthzReconcile.prototype, "prune", void 0);
395
+ __decorate([
396
+ flags.boolean({
397
+ description: 'Allow --prune to delete facts while authz_assignments/authz_denies are empty — check your connection first',
398
+ }),
399
+ __metadata("design:type", Object)
400
+ ], AuthzReconcile.prototype, "allowMassDelete", void 0);
401
+ __decorate([
402
+ flags.boolean({
403
+ description: 'Allow --to=<ACTIVE driver> --from=<another>: rewrites into the serving driver facts the source no longer reflects (resurrects revocations made since the cutover)',
404
+ }),
405
+ __metadata("design:type", Object)
406
+ ], AuthzReconcile.prototype, "allowStaleSource", void 0);
407
+ __decorate([
408
+ flags.number({ description: 'Rows per source batch and operations per destination write (default 100)' }),
409
+ __metadata("design:type", Object)
410
+ ], AuthzReconcile.prototype, "batchSize", void 0);
411
+ __decorate([
412
+ flags.number({
413
+ description: 'Declared cap on the destination dump this pass holds in memory (default 1000000); above it, 500 E_AUTHZ_RECONCILE_TOO_LARGE before writing anything',
414
+ }),
415
+ __metadata("design:type", Object)
416
+ ], AuthzReconcile.prototype, "maxTuples", void 0);
417
+ //# sourceMappingURL=authz_reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authz_reconcile.js","sourceRoot":"","sources":["../../commands/authz_reconcile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ import { BaseCommand } from '@adonisjs/core/ace';
2
+ import { CommandOptions } from '@adonisjs/core/types/ace';
3
+ import type { RelationsReconcileOptions, RelationsReconcileReport } from '../src/relations/reconcile.js';
4
+ import type { AuthorizationManager } from '../src/manager.js';
5
+ /**
6
+ * **La ÚNICA vía pública para reconciliar relaciones** (L-1 · J1; cierre del
7
+ * auditor de alpha.10 · R1/R4). `reconcileRelations` (`src/relations/`) es el
8
+ * primitivo: no puede ver al manager de roles (regla 2 de pureza), así que no
9
+ * sabe cuál es el driver ACTIVO ni puede tomar la ventana durable. Hasta el
10
+ * cierre se exportaba desde la raíz del paquete y el README lo recomendaba para
11
+ * K particiones: esa vía llegaba a la dirección rancia sin guard y sin freeze.
12
+ * Ahora sale de la raíz y TODA migración de relaciones pasa por aquí —el
13
+ * comando, un bucle por particiones de la plataforma—, que es el punto único
14
+ * donde viven las dos garantías:
15
+ *
16
+ * - **la dirección RANCIA** (alpha.10 · S1, gemelo de `manager.reconcile`):
17
+ * hacia el driver de relaciones activo (`relations.default ?? default`)
18
+ * ningún origen distinto pasa. **El origen y el destino se RESUELVEN aquí,
19
+ * por su clave, desde el config del manager** (R4): hasta el cierre la
20
+ * función recibía las instancias `from`/`to` y, aparte, las ETIQUETAS
21
+ * `toKey`/`fromKey`/`activeKey`, y juzgaba las etiquetas — un bucle con
22
+ * `fromKey === toKey` copiado y pegado, o un `activeKey` que contradecía al
23
+ * manager, escribía la compartición retirada en el activo. La identidad es
24
+ * la de la factory resuelta: dos claves con la MISMA factory son el mismo
25
+ * driver (un alias del activo también se niega);
26
+ * - **la ventana durable**: `--dry-run` **NO congela** (el verificador es
27
+ * read-only y está hecho para un cron); la pasada que ESCRIBE corre bajo
28
+ * `withFrozenWrites` con `kind: 'reconcile'` y la ventana del OPERADOR como
29
+ * contexto propio; un freeze vivo de OTRA pasada es 423; el reporte publica
30
+ * `frozen` —fence, lease, `window` y **`lapsed`**— y un lease perdido a
31
+ * mitad significa que la pasada NO se certifica (exit ≠ 0).
32
+ *
33
+ * Límite declarado (auditor · R5): el activo es el que dice el config del
34
+ * PROCESO que ejecuta esto; un Job con otro entorno apaga el guard. El sello
35
+ * durable del driver activo está en el roadmap (2.5).
36
+ */
37
+ /**
38
+ * **Las opciones PÚBLICAS de `runRelationsReconcile`** (cierre-2 de alpha.10 · C7):
39
+ * las del primitivo sin `from`/`to` (instancias: retiradas) más las claves. Hasta el
40
+ * cierre-2 la raíz exportaba `RelationsReconcileOptions` —la forma del primitivo, con
41
+ * `from`/`to` obligatorios— y no esta.
42
+ */
43
+ export type RunRelationsReconcileOptions = Omit<RelationsReconcileOptions, 'from' | 'to'> & {
44
+ /** Clave (en `relations.drivers` del config del manager) del DESTINO. */
45
+ toKey: string;
46
+ /** Clave del ORIGEN (el de `--from` o el elegido por descarte). */
47
+ fromKey: string;
48
+ /** La salida humana de `E_AUTHZ_STALE_SOURCE_REFUSED`. */
49
+ allowStaleSource?: boolean;
50
+ };
51
+ /**
52
+ * Límites DECLARADOS de la identidad (cierre-2 de alpha.10 · C1 y C6):
53
+ * - la identidad es la REFERENCIA de la factory: dos factories DISTINTAS que
54
+ * construyen el mismo backend (`fga: () => new OpenFgaRelationsDriver(…mismo
55
+ * store…)`) NO se detectan — el alias pasa el guard. No se construye nada antes
56
+ * del guard, así que no hay backend que comparar; identidad declarada por el
57
+ * driver ⇒ roadmap 2.5. Registra un alias con la MISMA referencia
58
+ * (`const fga = () => …; drivers: { openfga: fga, alias: fga }`) o no lo registres.
59
+ * - `authorization` es estructural (`Pick<…>`): un objeto que FALSEA
60
+ * `relationsDriverKey`/`relationsDriverFactory` decide el activo y las factories.
61
+ * Pásale el manager del servicio, nunca uno construido o envuelto a mano.
62
+ */
63
+ export declare function runRelationsReconcile(authorization: Pick<AuthorizationManager, 'withFrozenWrites' | 'relationsDriverKey' | 'relationsDriverFactory'>, options: RunRelationsReconcileOptions): Promise<RelationsReconcileReport>;
64
+ /**
65
+ * Cómo se nombra la ventana en la que corrió la pasada (2.4.0-alpha.10 · 3):
66
+ * la del OPERADOR dice si caduca y cuándo — hasta alpha.9 una ventana abierta
67
+ * con `--lease-ms` salía como «ventana del operador» a secas, sin caducidad.
68
+ */
69
+ export declare function frozenWindowLabel(frozen: {
70
+ leaseMs: number | null;
71
+ untilMs?: number | null;
72
+ window?: 'operator' | 'own' | 'enclosing';
73
+ }): string;
74
+ /**
75
+ * Las líneas del reporte de `authz:relations:reconcile` y si la pasada es
76
+ * «limpia», en una función PURA (mismo patrón que `reconcileLines` de roles):
77
+ * es lo único del comando que DECIDE algo, y así tiene su caso sin montar un
78
+ * ace.
79
+ *
80
+ * Qué cuenta como deriva —y por tanto como exit ≠ 0—:
81
+ * - **`modelDrift`** (siempre): un tipo de relación presente en el ORIGEN que
82
+ * la config del DESTINO no declara. No cabe en su modelo fusionado, así que
83
+ * esas tuplas nunca resolverían allí — es la deriva del presupuesto de
84
+ * modelo compartido, no un detalle cosmético;
85
+ * - en `--dry-run`, **cualquier cosa que la pasada haría** (escribir, borrar o
86
+ * dejar `extra` sin `--prune`): es el verificador, y para eso está en CI.
87
+ *
88
+ * `extra` en una pasada que SÍ escribe (sin `--prune`) se AVISA —«repite con
89
+ * --prune»— pero no tumba: el operador eligió no podar. Es la misma cortesía
90
+ * que `authz:reconcile` de roles con la ventana del relay.
91
+ */
92
+ export declare function relationsReconcileLines(report: RelationsReconcileReport): {
93
+ lines: Array<{
94
+ level: 'log' | 'warning' | 'error' | 'success';
95
+ message: string;
96
+ }>;
97
+ clean: boolean;
98
+ };
99
+ /**
100
+ * **`authz:relations:reconcile`** (Fase 4, lote 4-6) — migra las tuplas de
101
+ * RELACIÓN de un `RelationsDriver` a otro, idempotente y bidireccional, nunca
102
+ * silenciosa. Es el comando de plataforma que envuelve `reconcileRelations`
103
+ * (lote 4-5), análogo a `authz:reconcile` de roles pero para el puerto
104
+ * `RelationsDriver`.
105
+ *
106
+ * node ace authz:relations:reconcile --to=openfga --dry-run # el VERIFICADOR
107
+ * node ace authz:relations:reconcile --to=openfga # migra
108
+ * node ace authz:relations:reconcile --to=openfga --prune # y borra lo que el origen ya no respalda
109
+ *
110
+ * `--to`/`--from` nombran claves de `relations.drivers` en
111
+ * `config/authorization.ts` (NO las de `drivers` de roles): las relaciones
112
+ * tienen su propio puerto y sus propios drivers. La factory del driver
113
+ * `openfga` de relaciones entra por el subpath `/openfga` DENTRO de ella, así
114
+ * que este comando NUNCA importa el SDK (pureza).
115
+ *
116
+ * **Solo migra HECHOS de relación**: no hay árbol ni catálogo en `relations/`,
117
+ * así que —a diferencia de `authz:reconcile` de roles— no hay fases de marcador
118
+ * de raíz, proyección ni árbol. La migración es **POR partición**
119
+ * (mono-tenant: `APP_SCOPE`, el default); para migrar otra partición se pasan
120
+ * `--partition-type`/`--partition-uuid`, y migrar TODAS es iterar por el
121
+ * consumidor (una migración de tenant es un caso natural).
122
+ *
123
+ * **`--dry-run` es el verificador y es read-only por contrato** (como el de
124
+ * roles, S18): mismo recorrido, cero escrituras, los mismos números; NO hay
125
+ * `--fix`. Además vigila la **deriva del modelo fusionado** (`modelDrift`): un
126
+ * tipo del origen que el destino no declara sale como error.
127
+ *
128
+ * Es una operación de PLATAFORMA: no lleva actor, no se expone por HTTP.
129
+ */
130
+ export default class AuthzRelationsReconcile extends BaseCommand {
131
+ static commandName: string;
132
+ static description: string;
133
+ static options: CommandOptions;
134
+ to: string | undefined;
135
+ from: string | undefined;
136
+ dryRun: boolean | undefined;
137
+ prune: boolean | undefined;
138
+ allowMassDelete: boolean | undefined;
139
+ allowStaleSource: boolean | undefined;
140
+ partitionType: string | undefined;
141
+ partitionUuid: string | undefined;
142
+ run(): Promise<void>;
143
+ }
144
+ //# sourceMappingURL=authz_relations_reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authz_relations_reconcile.d.ts","sourceRoot":"","sources":["../../commands/authz_relations_reconcile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AACxG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAG7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAAC,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG;IAC1F,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAA;IACb,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAA;IACf,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,qBAAqB,CACzC,aAAa,EAAE,IAAI,CAAC,oBAAoB,EAAE,kBAAkB,GAAG,oBAAoB,GAAG,wBAAwB,CAAC,EAC/G,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,wBAAwB,CAAC,CAkFnC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,WAAW,CAAA;CAC1C,GAAG,MAAM,CAaT;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,wBAAwB,GAAG;IACzE,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjF,KAAK,EAAE,OAAO,CAAA;CACf,CAiHA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,WAAW;IAC9D,MAAM,CAAC,WAAW,SAA8B;IAChD,MAAM,CAAC,WAAW,SAAgG;IAElH,MAAM,CAAC,OAAO,EAAE,cAAc,CAE7B;IAGO,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;IAGtB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IAGxB,MAAM,EAAE,OAAO,GAAG,SAAS,CAAA;IAG3B,KAAK,EAAE,OAAO,GAAG,SAAS,CAAA;IAK1B,eAAe,EAAE,OAAO,GAAG,SAAS,CAAA;IAMpC,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAA;IAGrC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IAGjC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IAEnC,GAAG;CAwJV"}