@jantstack/adonis-authz 2.4.0-alpha.8 → 2.5.0-alpha.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 (119) hide show
  1. package/README.md +300 -15
  2. package/build/commands/authz_catalog_diff.d.ts.map +1 -1
  3. package/build/commands/authz_catalog_diff.js +0 -1
  4. package/build/commands/authz_catalog_diff.js.map +1 -1
  5. package/build/commands/authz_catalog_prune_orphans.d.ts.map +1 -1
  6. package/build/commands/authz_catalog_prune_orphans.js +0 -1
  7. package/build/commands/authz_catalog_prune_orphans.js.map +1 -1
  8. package/build/commands/authz_freeze.d.ts.map +1 -1
  9. package/build/commands/authz_freeze.js +1 -2
  10. package/build/commands/authz_freeze.js.map +1 -1
  11. package/build/commands/authz_reconcile.d.ts +10 -3
  12. package/build/commands/authz_reconcile.d.ts.map +1 -1
  13. package/build/commands/authz_reconcile.js +168 -18
  14. package/build/commands/authz_reconcile.js.map +1 -1
  15. package/build/commands/authz_relations_reconcile.d.ts +66 -19
  16. package/build/commands/authz_relations_reconcile.d.ts.map +1 -1
  17. package/build/commands/authz_relations_reconcile.js +231 -44
  18. package/build/commands/authz_relations_reconcile.js.map +1 -1
  19. package/build/commands/authz_scopes_relay.d.ts.map +1 -1
  20. package/build/commands/authz_scopes_relay.js +82 -6
  21. package/build/commands/authz_scopes_relay.js.map +1 -1
  22. package/build/commands/authz_scopes_requeue.d.ts.map +1 -1
  23. package/build/commands/authz_scopes_requeue.js +0 -2
  24. package/build/commands/authz_scopes_requeue.js.map +1 -1
  25. package/build/commands/authz_unfreeze.d.ts +12 -4
  26. package/build/commands/authz_unfreeze.d.ts.map +1 -1
  27. package/build/commands/authz_unfreeze.js +74 -9
  28. package/build/commands/authz_unfreeze.js.map +1 -1
  29. package/build/index.d.ts +6 -4
  30. package/build/index.d.ts.map +1 -1
  31. package/build/index.js +5 -3
  32. package/build/index.js.map +1 -1
  33. package/build/providers/authz_provider.d.ts +1 -1
  34. package/build/providers/authz_provider.d.ts.map +1 -1
  35. package/build/providers/authz_provider.js +2 -1
  36. package/build/providers/authz_provider.js.map +1 -1
  37. package/build/src/define_config.d.ts +9 -0
  38. package/build/src/define_config.d.ts.map +1 -1
  39. package/build/src/define_config.js +11 -0
  40. package/build/src/define_config.js.map +1 -1
  41. package/build/src/drivers/database_driver.d.ts.map +1 -1
  42. package/build/src/drivers/database_driver.js +1 -0
  43. package/build/src/drivers/database_driver.js.map +1 -1
  44. package/build/src/drivers/database_relations_driver.d.ts +18 -6
  45. package/build/src/drivers/database_relations_driver.d.ts.map +1 -1
  46. package/build/src/drivers/database_relations_driver.js +91 -44
  47. package/build/src/drivers/database_relations_driver.js.map +1 -1
  48. package/build/src/drivers/openfga_driver.d.ts +62 -4
  49. package/build/src/drivers/openfga_driver.d.ts.map +1 -1
  50. package/build/src/drivers/openfga_driver.js +182 -28
  51. package/build/src/drivers/openfga_driver.js.map +1 -1
  52. package/build/src/drivers/openfga_relations_driver.d.ts +16 -4
  53. package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -1
  54. package/build/src/drivers/openfga_relations_driver.js +71 -34
  55. package/build/src/drivers/openfga_relations_driver.js.map +1 -1
  56. package/build/src/errors.d.ts +50 -0
  57. package/build/src/errors.d.ts.map +1 -1
  58. package/build/src/errors.js +50 -0
  59. package/build/src/errors.js.map +1 -1
  60. package/build/src/freeze.d.ts +63 -4
  61. package/build/src/freeze.d.ts.map +1 -1
  62. package/build/src/freeze.js +107 -18
  63. package/build/src/freeze.js.map +1 -1
  64. package/build/src/identity.d.ts +120 -9
  65. package/build/src/identity.d.ts.map +1 -1
  66. package/build/src/identity.js +164 -12
  67. package/build/src/identity.js.map +1 -1
  68. package/build/src/manager.d.ts +64 -2
  69. package/build/src/manager.d.ts.map +1 -1
  70. package/build/src/manager.js +271 -35
  71. package/build/src/manager.js.map +1 -1
  72. package/build/src/openfga.d.ts +1 -1
  73. package/build/src/openfga.d.ts.map +1 -1
  74. package/build/src/openfga.js +1 -1
  75. package/build/src/openfga.js.map +1 -1
  76. package/build/src/relations/check_many.d.ts +17 -0
  77. package/build/src/relations/check_many.d.ts.map +1 -0
  78. package/build/src/relations/check_many.js +57 -0
  79. package/build/src/relations/check_many.js.map +1 -0
  80. package/build/src/relations/manager.d.ts +20 -0
  81. package/build/src/relations/manager.d.ts.map +1 -1
  82. package/build/src/relations/manager.js +84 -13
  83. package/build/src/relations/manager.js.map +1 -1
  84. package/build/src/relations/reconcile.d.ts +67 -0
  85. package/build/src/relations/reconcile.d.ts.map +1 -1
  86. package/build/src/relations/reconcile.js +123 -30
  87. package/build/src/relations/reconcile.js.map +1 -1
  88. package/build/src/relations/tuple_key.d.ts +25 -0
  89. package/build/src/relations/tuple_key.d.ts.map +1 -0
  90. package/build/src/relations/tuple_key.js +60 -0
  91. package/build/src/relations/tuple_key.js.map +1 -0
  92. package/build/src/shared/backend_guard.d.ts +30 -11
  93. package/build/src/shared/backend_guard.d.ts.map +1 -1
  94. package/build/src/shared/backend_guard.js +45 -15
  95. package/build/src/shared/backend_guard.js.map +1 -1
  96. package/build/src/shared/sql_expiry.d.ts +2 -0
  97. package/build/src/shared/sql_expiry.d.ts.map +1 -1
  98. package/build/src/shared/sql_expiry.js +4 -0
  99. package/build/src/shared/sql_expiry.js.map +1 -1
  100. package/build/src/testing/main.d.ts +3 -1
  101. package/build/src/testing/main.d.ts.map +1 -1
  102. package/build/src/testing/main.js +2 -1
  103. package/build/src/testing/main.js.map +1 -1
  104. package/build/src/testing/migration_contract.d.ts +9 -0
  105. package/build/src/testing/migration_contract.d.ts.map +1 -1
  106. package/build/src/testing/migration_contract.js +5 -2
  107. package/build/src/testing/migration_contract.js.map +1 -1
  108. package/build/src/testing/relations_contract.d.ts +14 -0
  109. package/build/src/testing/relations_contract.d.ts.map +1 -1
  110. package/build/src/testing/relations_contract.js +297 -21
  111. package/build/src/testing/relations_contract.js.map +1 -1
  112. package/build/src/testing/test_clock.d.ts +15 -0
  113. package/build/src/testing/test_clock.d.ts.map +1 -0
  114. package/build/src/testing/test_clock.js +65 -0
  115. package/build/src/testing/test_clock.js.map +1 -0
  116. package/build/src/types.d.ts +148 -9
  117. package/build/src/types.d.ts.map +1 -1
  118. package/build/src/types.js.map +1 -1
  119. package/package.json +5 -1
@@ -8,37 +8,110 @@ var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
10
  import { BaseCommand, flags } from '@adonisjs/core/ace';
11
+ import { AuthorizationConfigError, StaleSourceRefusedError } from '../src/errors.js';
11
12
  /**
12
- * **La pasada de relaciones bajo la ventana DURABLE** (L-1 · J1, juez del
13
- * panel `{trx}`). `reconcileRelations` (`src/relations/`) no puede ver al
14
- * manager de roles (regla 2 de pureza), así que la ventana la abre el
15
- * comando, aquí, con la misma forma que `authz:reconcile` de roles:
16
- *
17
- * - `--dry-run` **NO congela** (el verificador es read-only y está hecho
18
- * para un cron: un mecanismo de indisponibilidad no se dispara desde ahí);
19
- * - la pasada que ESCRIBE corre bajo `withFrozenWrites` con `kind:
20
- * 'reconcile'` y la ventana del OPERADOR como contexto propio (el cutover:
21
- * corre dentro, no la toma, no la renueva, no la levanta); un freeze vivo
22
- * de OTRA pasada es 423;
23
- * - el reporte publica `frozen` —fence, lease y **`lapsed`**— y un lease
24
- * perdido a mitad significa que la pasada NO se certifica (exit ≠ 0).
25
- *
26
- * Durante la ventana TODA escritura del paquete responde 503 `E_AUTHZ_FROZEN`
27
- * en la flota: las de roles y, desde L-1, las de relaciones
28
- * (`RelationsManager` pasa la misma barrera). Función exportada para tener su
29
- * caso sin montar un ace.
13
+ * Límites DECLARADOS de la identidad (cierre-2 de alpha.10 · C1 y C6):
14
+ * - la identidad es la REFERENCIA de la factory: dos factories DISTINTAS que
15
+ * construyen el mismo backend (`fga: () => new OpenFgaRelationsDriver(…mismo
16
+ * store…)`) NO se detectan — el alias pasa el guard. No se construye nada antes
17
+ * del guard, así que no hay backend que comparar; identidad declarada por el
18
+ * driver ⇒ roadmap 2.5. Registra un alias con la MISMA referencia
19
+ * (`const fga = () => …; drivers: { openfga: fga, alias: fga }`) o no lo registres.
20
+ * - `authorization` es estructural (`Pick<…>`): un objeto que FALSEA
21
+ * `relationsDriverKey`/`relationsDriverFactory` decide el activo y las factories.
22
+ * Pásale el manager del servicio, nunca uno construido o envuelto a mano.
30
23
  */
31
24
  export async function runRelationsReconcile(authorization, options) {
32
25
  const { reconcileRelations } = await import('../src/relations/reconcile.js');
26
+ const raw = options;
27
+ // Entradas que ya no gobiernan nada (L5: una opción inerte no cae en un
28
+ // default en silencio). `from`/`to` como instancias y `activeKey` eran
29
+ // justo las etiquetas desalineables del R4.
30
+ const retiredOptions = ['from', 'to', 'activeKey'].filter((name) => raw[name] !== undefined);
31
+ if (retiredOptions.length > 0) {
32
+ throw new AuthorizationConfigError(`runRelationsReconcile: ${retiredOptions.map((n) => `\`${n}\``).join(', ')} ya no se acepta(n) (cierre de 2.4.0-alpha.10): ` +
33
+ 'el origen y el destino se resuelven por `fromKey`/`toKey` desde el config del manager, y el driver activo lo ' +
34
+ 'dice el manager (`relations.default ?? default`). Pasar instancias o un activo propio permitía que la etiqueta ' +
35
+ 'contradijera al driver y la dirección rancia pasara.');
36
+ }
37
+ if (typeof options.toKey !== 'string' || typeof options.fromKey !== 'string') {
38
+ throw new AuthorizationConfigError('runRelationsReconcile: hacen falta `toKey` y `fromKey` (las claves de relations.drivers del destino y del ORIGEN) ' +
39
+ 'desde 2.4.0-alpha.10 — sin ellas no se puede negar la dirección rancia (re-escribir en el driver de relaciones ' +
40
+ 'ACTIVO lo que el origen dejó de ver en el cutover).');
41
+ }
42
+ const { toKey, fromKey, allowStaleSource, ...rest } = options;
43
+ const toFactory = authorization.relationsDriverFactory(toKey);
44
+ const fromFactory = authorization.relationsDriverFactory(fromKey);
45
+ for (const [role, key, factory] of [['destino', toKey, toFactory], ['origen', fromKey, fromFactory]]) {
46
+ if (typeof factory !== 'function') {
47
+ throw new AuthorizationConfigError(`runRelationsReconcile: el ${role} '${key}' no es una clave de relations.drivers en el config del manager.`);
48
+ }
49
+ }
50
+ const active = authorization.relationsDriverKey();
51
+ /** Mismo driver ⇔ misma clave o misma factory resuelta (un alias es el mismo driver). */
52
+ const sameDriver = (a, b) => a === b || authorization.relationsDriverFactory(a) === authorization.relationsDriverFactory(b);
53
+ if (sameDriver(fromKey, toKey)) {
54
+ throw new AuthorizationConfigError(`runRelationsReconcile: el origen '${fromKey}' y el destino '${toKey}' son el MISMO driver ` +
55
+ `(${fromKey === toKey ? 'misma clave' : 'la misma factory bajo dos claves'}): no hay nada que migrar y un --prune ` +
56
+ 'se compararía consigo mismo. Nombra el otro driver.');
57
+ }
58
+ const stale = sameDriver(toKey, active);
59
+ const allowStale = allowStaleSource === true;
60
+ if (stale && !allowStale && options.dryRun !== true) {
61
+ const alias = toKey === active ? '' : ` (la clave '${toKey}' resuelve la MISMA factory que el activo '${active}')`;
62
+ throw new StaleSourceRefusedError(`authz:relations:reconcile --to=${toKey} (origen '${fromKey}'): '${toKey}' es el driver de ` +
63
+ `relaciones ACTIVO (relations.default ?? default)${alias} y el origen no lo es. Esa dirección re-escribiría en el driver ` +
64
+ `activo tuplas que el origen ya no refleja: resucitaría las comparticiones retiradas desde el cutover (y con ` +
65
+ `--prune borraría las creadas después). No se ha construido, leído, congelado ni escrito nada. Tras el cutover el driver ` +
66
+ `activo ES la fuente de verdad de las relaciones: no hay nada que migrar hacia él; para volver atrás, migra en ` +
67
+ `la otra dirección (--to=${fromKey} --from=${toKey}) ANTES de cambiar relations.default/default. ` +
68
+ `Si de verdad el origen sigue siendo la fuente de verdad, la decisión humana es --allow-stale-source ` +
69
+ `(allowStaleSource: true).`);
70
+ }
71
+ const from = await fromFactory();
72
+ const to = await toFactory();
73
+ const pass = () => reconcileRelations({ ...rest, from, to });
74
+ const mark = (report) => {
75
+ if (stale)
76
+ report.staleSource = { to: toKey, from: fromKey, allowed: allowStale };
77
+ return report;
78
+ };
33
79
  if (options.dryRun === true)
34
- return reconcileRelations(options);
35
- const reason = `authz:relations:reconcile${options.toKey ? ` --to=${options.toKey}` : ''}`;
80
+ return mark(await pass());
81
+ const reason = `authz:relations:reconcile --to=${toKey}`;
36
82
  return authorization.withFrozenWrites(reason, async (window) => {
37
- const report = await reconcileRelations(options);
38
- report.frozen = { durable: true, lapsed: await window.lapsed(), leaseMs: window.leaseMs, fence: window.fence };
83
+ const report = mark(await pass());
84
+ report.frozen = {
85
+ durable: true,
86
+ lapsed: await window.lapsed(),
87
+ leaseMs: window.leaseMs,
88
+ fence: window.fence,
89
+ ...(window.untilMs === undefined ? {} : { untilMs: window.untilMs }),
90
+ ...(window.window === undefined ? {} : { window: window.window }),
91
+ };
39
92
  return report;
40
93
  }, { kind: 'reconcile', operatorAsContext: true });
41
94
  }
95
+ /**
96
+ * Cómo se nombra la ventana en la que corrió la pasada (2.4.0-alpha.10 · 3):
97
+ * la del OPERADOR dice si caduca y cuándo — hasta alpha.9 una ventana abierta
98
+ * con `--lease-ms` salía como «ventana del operador» a secas, sin caducidad.
99
+ */
100
+ export function frozenWindowLabel(frozen) {
101
+ // alpha.10 · S2: la ventana PROPIA se dice como tal — «no había ventana de
102
+ // operador viva» es justo lo que el operador de un cutover necesita leer.
103
+ if (frozen.window === 'own') {
104
+ return `, ventana PROPIA de la pasada (lease ${frozen.leaseMs} ms): NO había ventana de operador viva`;
105
+ }
106
+ if (frozen.window === 'enclosing')
107
+ return `, ventana que ya sostenía este proceso`;
108
+ if (frozen.untilMs !== undefined) {
109
+ return frozen.untilMs === null
110
+ ? ', ventana del operador sin caducidad'
111
+ : `, ventana del operador que CADUCA el ${new Date(frozen.untilMs).toISOString()} (le quedaban ${frozen.leaseMs} ms)`;
112
+ }
113
+ return frozen.leaseMs === null ? ', ventana del operador' : `, lease ${frozen.leaseMs} ms`;
114
+ }
42
115
  /**
43
116
  * Las líneas del reporte de `authz:relations:reconcile` y si la pasada es
44
117
  * «limpia», en una función PURA (mismo patrón que `reconcileLines` de roles):
@@ -92,10 +165,69 @@ export function relationsReconcileLines(report) {
92
165
  'defineRelationsConfig del destino (y republica su modelo) antes de migrarlas.',
93
166
  });
94
167
  }
168
+ // ⚪ R2 (cierre-2 del lote A; linaje L8, «una operación destructiva lista lo
169
+ // que destruye»): lo enumerado con una identidad fuera de la gramática, UNA
170
+ // línea por tupla con su lado y su porqué. Nunca fue una pregunta del
171
+ // llamante (invariante 5), así que nunca es un 422 que tumbe la pasada:
172
+ // - destino + prune: «se pedirá borrar» (dry-run; y dice que con los drivers
173
+ // del paquete la pasada real NO la borrará: a mano YA — ⚪ R2 del re-ataque
174
+ // al cierre-2, cierre-3) / «BORRADA» (real); si el DRIVER del destino la
175
+ // rechazó por el puerto, «NO se pudo borrar … a mano» (error: sigue ahí y
176
+ // la pasada no es limpia);
177
+ // - destino sin prune: sobra con motivo (warning; `extra` la cuenta);
178
+ // - origen: no se migra (la API no la puede escribir): deriva, a mano.
179
+ let invalidRefused = 0;
180
+ for (const detail of report.details ?? []) {
181
+ const what = `(${detail.reason}) ${detail.side}: ${detail.tuple} — ${detail.message}`;
182
+ if (detail.side === 'origen') {
183
+ lines.push({
184
+ level: 'error',
185
+ message: `sin migrar ${what}. Es un dato del store de ORIGEN, no una pregunta: corrígela o bórrala a mano (SQL/SDK) y repite la pasada.`,
186
+ });
187
+ continue;
188
+ }
189
+ if (detail.pruned === true) {
190
+ lines.push({
191
+ level: 'log',
192
+ message: report.dryRun
193
+ ? `con --prune se pedirá al driver del destino que la BORRE ${what}. OJO: con los drivers del paquete (database/openfga) la pasada real NO la borrará (su gramática en unrelate la rechaza, R-16) y saldrá con exit 1 hasta que la borres a mano (SQL/SDK): bórrala ya, no esperes a la pasada real.`
194
+ : `BORRADA por --prune ${what}.`,
195
+ });
196
+ continue;
197
+ }
198
+ if (detail.pruned === false) {
199
+ invalidRefused += 1;
200
+ lines.push({
201
+ level: 'error',
202
+ message: `NO se pudo borrar con --prune ${what}: el driver del destino la rechaza por el puerto (su gramática en unrelate). Sigue ahí: bórrala a mano (SQL/SDK).`,
203
+ });
204
+ continue;
205
+ }
206
+ lines.push({
207
+ level: 'warning',
208
+ message: `sobra ${what}: nadie del origen puede respaldarla; repite con --prune para pedir su borrado.`,
209
+ });
210
+ }
95
211
  // R-17: el seguro de borrado masivo. En una pasada REAL sin --allow-mass-delete
96
212
  // esto ya habría lanzado 500 antes de llegar aquí; en --dry-run NO lanza y lo
97
213
  // marca, así que el verificador tiene que sacarlo como deriva (exit ≠ 0).
98
- if (report.massDelete) {
214
+ // **F-R2 (plan 2.5 · lote A; linaje L8, letra ≠ efecto)**: con el seguro
215
+ // LEVANTADO (`--allow-mass-delete`) la pasada real YA vació el destino: la
216
+ // letra lo dice así y es limpia (fue la decisión humana); en `--dry-run` dice
217
+ // que la real lo HARÁ y sigue siendo deriva (haría algo). Sin la bandera, el
218
+ // error de siempre. Tabla de verdad en `tests/relations_reconcile_cli.spec.ts`.
219
+ const massDeleteLifted = report.massDelete && report.allowMassDelete === true;
220
+ if (massDeleteLifted) {
221
+ lines.push({
222
+ level: 'warning',
223
+ message: report.dryRun
224
+ ? `--prune borraría ${report.extra || report.deleted} tupla(s) del destino con un ORIGEN sin NI UNA utilizable; ` +
225
+ '--allow-mass-delete está puesto, así que la pasada real las BORRARÁ. Comprueba el --from antes de correrla.'
226
+ : `El seguro de borrado masivo se LEVANTÓ con --allow-mass-delete: se han borrado ${report.deleted} tupla(s) del destino ` +
227
+ 'con un ORIGEN que no aportó NI UNA utilizable. Era tu decisión; si el --from era el equivocado, repite la pasada desde el correcto.',
228
+ });
229
+ }
230
+ else if (report.massDelete) {
99
231
  lines.push({
100
232
  level: 'error',
101
233
  message: `--prune borraría ${report.extra || report.deleted} tupla(s) del destino y el ORIGEN no aportó NI UNA ` +
@@ -126,15 +258,31 @@ export function relationsReconcileLines(report) {
126
258
  lines.push({
127
259
  level: 'log',
128
260
  message: `Escrituras congeladas durante la pasada (fence ${report.frozen.fence}` +
129
- `${report.frozen.leaseMs === null ? ', ventana del operador' : `, lease ${report.frozen.leaseMs} ms`}): ` +
261
+ `${frozenWindowLabel(report.frozen)}): ` +
130
262
  'la ventana aguantó entera.',
131
263
  });
132
264
  }
133
265
  }
266
+ // alpha.10 · S1: la dirección rancia se dice siempre; en el verificador es deriva.
267
+ if (report.staleSource !== undefined) {
268
+ const { to, from, allowed } = report.staleSource;
269
+ lines.push({
270
+ level: 'warning',
271
+ message: `dirección RANCIA: '${to}' es el driver de relaciones ACTIVO y las tuplas salen de '${from}', que dejó de verlas ` +
272
+ 'en el cutover — esta pasada resucita las comparticiones retiradas desde entonces (y con --prune borra las ' +
273
+ 'nuevas). ' +
274
+ (allowed
275
+ ? 'Levantada a sabiendas con --allow-stale-source.'
276
+ : 'Sin --allow-stale-source la pasada de verdad se niega (E_AUTHZ_STALE_SOURCE_REFUSED).'),
277
+ });
278
+ }
134
279
  const cambios = report.written + report.updated + report.deleted + (report.dryRun ? report.extra : 0);
135
- const clean = report.modelDrift.length === 0 &&
280
+ const clean = !(report.dryRun && report.staleSource !== undefined && !report.staleSource.allowed) &&
281
+ report.modelDrift.length === 0 &&
136
282
  report.skipped.undeclared === 0 &&
137
- !report.massDelete &&
283
+ (report.skipped.invalid ?? 0) === 0 &&
284
+ invalidRefused === 0 &&
285
+ !(report.massDelete && !massDeleteLifted) &&
138
286
  !(report.frozen?.lapsed === true) &&
139
287
  (!report.dryRun || cambios === 0);
140
288
  return { lines, clean };
@@ -183,9 +331,13 @@ export default class AuthzRelationsReconcile extends BaseCommand {
183
331
  this.exitCode = 1;
184
332
  return;
185
333
  }
186
- const config = this.app.config.get('authorization');
187
- const factories = config?.relations?.drivers ?? {};
188
- const keys = Object.keys(factories);
334
+ // Cierre del auditor de alpha.10 · R4: las claves, las factories y el driver
335
+ // ACTIVO salen del MISMO sitio — el manager de servicio (construido desde
336
+ // config/authorization.ts) —, que es también quien toma la ventana. Hasta el
337
+ // cierre el comando resolvía los drivers de `this.app.config` y le pasaba a
338
+ // `runRelationsReconcile` las instancias y, aparte, las etiquetas.
339
+ const { default: authorization } = await import('../services/main.js');
340
+ const keys = authorization.relationsDriverKeys();
189
341
  if (keys.length === 0) {
190
342
  this.logger.error('No hay `relations.drivers` en config/authorization.ts: declara los drivers de relaciones (por clave) ' +
191
343
  'para poder migrar sus tuplas.');
@@ -204,53 +356,82 @@ export default class AuthzRelationsReconcile extends BaseCommand {
204
356
  }
205
357
  fromKey = candidates[0];
206
358
  }
207
- if (!factories[this.to]) {
359
+ if (authorization.relationsDriverFactory(this.to) === undefined) {
208
360
  this.logger.error(`El destino '${this.to}' no es una clave de relations.drivers (${keys.join(', ')}).`);
209
361
  this.exitCode = 1;
210
362
  return;
211
363
  }
212
- if (!factories[fromKey]) {
364
+ if (authorization.relationsDriverFactory(fromKey) === undefined) {
213
365
  this.logger.error(`El origen '${fromKey}' no es una clave de relations.drivers (${keys.join(', ')}).`);
214
366
  this.exitCode = 1;
215
367
  return;
216
368
  }
217
369
  // La partición (mono-tenant por defecto). El reconcile es POR partición.
370
+ // Las DOS banderas van juntas o no va ninguna (cierre de alpha.9, 🟡 B del
371
+ // auditor): media pareja reconciliaba `app` en silencio, escribía CERO y
372
+ // salía `[success]` — la misma forma del 🔴 «migra 0 y reporta éxito» que
373
+ // este lote cierra, sobreviviendo a una errata del runbook de cutover.
374
+ if (this.partitionUuid && !this.partitionType) {
375
+ this.logger.error('--partition-uuid sin --partition-type: las dos banderas van juntas. ' +
376
+ 'Sin --partition-type se reconciliaría la partición RAÍZ (app) y tus tuplas por tenant no se migrarían.');
377
+ this.exitCode = 1;
378
+ return;
379
+ }
380
+ // alpha.10 · 5 (sexto informe de COGNITIV): la variante que el cierre de
381
+ // alpha.9 no cazó — pareja COMPLETA con `app` también reconciliaba la raíz
382
+ // en silencio, tirando el uuid (una errata del runbook: `app` por el tipo).
383
+ if (this.partitionType === 'app' && this.partitionUuid) {
384
+ this.logger.error(`--partition-type=app con --partition-uuid=${this.partitionUuid}: la partición raíz no lleva uuid. ` +
385
+ 'O quitas --partition-uuid (reconciliar la raíz) o pones el tipo del tenant en --partition-type.');
386
+ this.exitCode = 1;
387
+ return;
388
+ }
389
+ if (this.partitionType && this.partitionType !== 'app' && !this.partitionUuid) {
390
+ this.logger.error(`--partition-type=${this.partitionType} exige --partition-uuid (el tenant concreto a reconciliar).`);
391
+ this.exitCode = 1;
392
+ return;
393
+ }
218
394
  const partition = this.partitionType && this.partitionType !== 'app'
219
- ? { type: this.partitionType, uuid: this.partitionUuid ?? '' }
395
+ ? { type: this.partitionType, uuid: this.partitionUuid }
220
396
  : { type: 'app', uuid: null };
221
397
  // La config del DESTINO, para vigilar la deriva del modelo fusionado en
222
398
  // --dry-run: es la persistida (una sola en el store compartido).
223
399
  const { readRelationsConfig } = await import('../src/relations_config_store.js');
224
400
  const toConfig = await readRelationsConfig().catch(() => undefined);
225
- const from = await factories[fromKey]();
226
- const to = await factories[this.to]();
227
401
  // L-1 · J1: la pasada que ESCRIBE corre bajo la ventana durable del
228
402
  // manager de roles (la misma fila `id = 2`, toda la flota); `--dry-run` no.
229
- const { default: authorization } = await import('../services/main.js');
403
+ // Los drivers los construye `runRelationsReconcile`, DESPUÉS del guard.
230
404
  let report;
231
405
  try {
232
406
  report = await runRelationsReconcile(authorization, {
233
- from,
234
- to,
235
407
  partition,
236
408
  dryRun: this.dryRun === true,
237
409
  prune: this.prune === true,
238
410
  allowMassDelete: this.allowMassDelete === true,
411
+ allowStaleSource: this.allowStaleSource === true,
239
412
  toKey: this.to,
413
+ fromKey,
240
414
  ...(toConfig ? { toConfig } : {}),
241
415
  });
242
416
  }
243
417
  catch (error) {
244
418
  // R-17: el seguro de borrado masivo (500) sale como error de comando, no
245
419
  // como stack crudo. `--allow-mass-delete` es la salida humana.
246
- if (error?.code === 'E_AUTHZ_MASS_RECONCILE_REFUSED') {
420
+ if (error?.code === 'E_AUTHZ_MASS_RECONCILE_REFUSED' || error?.code === 'E_AUTHZ_STALE_SOURCE_REFUSED') {
247
421
  this.logger.error(String(error.message ?? error));
248
422
  this.exitCode = 1;
249
423
  return;
250
424
  }
251
425
  // L-1 · J1: un freeze vivo de OTRA pasada (423): dos migraciones no se
252
426
  // pisan; el mensaje nombra al dueño y cómo se levanta.
253
- if (error?.code === 'E_AUTHZ_FREEZE_HELD') {
427
+ if (error?.code === 'E_AUTHZ_FREEZE_HELD' || error?.code === 'E_AUTHZ_OPERATOR_WINDOW_EXPIRED') {
428
+ this.logger.error(String(error.message ?? error));
429
+ this.exitCode = 1;
430
+ return;
431
+ }
432
+ // Cierre R4: origen y destino que resuelven el MISMO driver (misma clave o
433
+ // alias de la misma factory) es un error de configuración de la pasada.
434
+ if (error?.code === 'E_AUTHZ_CONFIG') {
254
435
  this.logger.error(String(error.message ?? error));
255
436
  this.exitCode = 1;
256
437
  return;
@@ -262,7 +443,8 @@ export default class AuthzRelationsReconcile extends BaseCommand {
262
443
  this.logger[level](message);
263
444
  const resumen = `escritas ${report.written}, actualizadas ${report.updated}, borradas ${report.deleted}, ` +
264
445
  `iguales ${report.unchanged}, sobran ${report.extra}, caducadas omitidas ${report.skipped.expired}, ` +
265
- `no declaradas en el destino ${report.skipped.undeclared}`;
446
+ `no declaradas en el destino ${report.skipped.undeclared}` +
447
+ (report.skipped.invalid ? `, fuera de la gramática en el origen ${report.skipped.invalid}` : '');
266
448
  if (report.dryRun) {
267
449
  if (clean) {
268
450
  this.logger.success(`Sin deriva: '${this.to}' coincide con '${fromKey}' (${resumen}).`);
@@ -288,7 +470,7 @@ __decorate([
288
470
  __metadata("design:type", Object)
289
471
  ], AuthzRelationsReconcile.prototype, "from", void 0);
290
472
  __decorate([
291
- flags.boolean({ name: 'dry-run', description: 'Report what it would do and write nothing (this is the verifier)' }),
473
+ flags.boolean({ description: 'Report what it would do and write nothing (this is the verifier)' }),
292
474
  __metadata("design:type", Object)
293
475
  ], AuthzRelationsReconcile.prototype, "dryRun", void 0);
294
476
  __decorate([
@@ -297,17 +479,22 @@ __decorate([
297
479
  ], AuthzRelationsReconcile.prototype, "prune", void 0);
298
480
  __decorate([
299
481
  flags.boolean({
300
- name: 'allow-mass-delete',
301
482
  description: 'Allow --prune to empty the destination when the source has no usable tuple (mass-delete safeguard)',
302
483
  }),
303
484
  __metadata("design:type", Object)
304
485
  ], AuthzRelationsReconcile.prototype, "allowMassDelete", void 0);
305
486
  __decorate([
306
- flags.string({ name: 'partition-type', description: 'Partition (tenant) scope type to migrate; default: app (mono-tenant)' }),
487
+ flags.boolean({
488
+ description: 'Allow --to=<ACTIVE relations driver> from another source: rewrites into the serving driver tuples the source no longer reflects',
489
+ }),
490
+ __metadata("design:type", Object)
491
+ ], AuthzRelationsReconcile.prototype, "allowStaleSource", void 0);
492
+ __decorate([
493
+ flags.string({ description: 'Partition (tenant) scope type to migrate; default: app (mono-tenant)' }),
307
494
  __metadata("design:type", Object)
308
495
  ], AuthzRelationsReconcile.prototype, "partitionType", void 0);
309
496
  __decorate([
310
- flags.string({ name: 'partition-uuid', description: 'Partition (tenant) scope uuid; required with --partition-type' }),
497
+ flags.string({ description: 'Partition (tenant) scope uuid; required with --partition-type' }),
311
498
  __metadata("design:type", Object)
312
499
  ], AuthzRelationsReconcile.prototype, "partitionUuid", void 0);
313
500
  //# sourceMappingURL=authz_relations_reconcile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"authz_relations_reconcile.js","sourceRoot":"","sources":["../../commands/authz_relations_reconcile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"authz_relations_reconcile.js","sourceRoot":"","sources":["../../commands/authz_relations_reconcile.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"authz_scopes_relay.d.ts","sourceRoot":"","sources":["../../commands/authz_scopes_relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,GAAE,OAAe,GACzB;IAAE,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAoC/F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,SAAuB;IACzC,MAAM,CAAC,WAAW,SAAiF;IAEnG,MAAM,CAAC,OAAO,EAAE,cAAc,CAE7B;IAMO,MAAM,EAAE,OAAO,GAAG,SAAS,CAAA;IAG3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IAGzB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAM7B,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;IAM1B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAM/B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAElC,+FAA+F;IAC/F,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS;IAS5E,GAAG;CAuGV"}
1
+ {"version":3,"file":"authz_scopes_relay.d.ts","sourceRoot":"","sources":["../../commands/authz_scopes_relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,GAAE,OAAe,GACzB;IAAE,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAoC/F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,SAAuB;IACzC,MAAM,CAAC,WAAW,SAAiF;IAEnG,MAAM,CAAC,OAAO,EAAE,cAAc,CAE7B;IAKO,MAAM,EAAE,OAAO,GAAG,SAAS,CAAA;IAG3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IAGzB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAK7B,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;IAK1B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAK/B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAElC,+FAA+F;IAC/F,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS;IAS5E,GAAG;CAgMV"}
@@ -140,6 +140,15 @@ export default class AuthzScopesRelay extends BaseCommand {
140
140
  this.exitCode = 1;
141
141
  return;
142
142
  }
143
+ // alpha.10 · S7 (auditoría de sistema): el umbral se valida ANTES de tocar
144
+ // la cola. Hasta alpha.9 `queueAgeLines` lanzaba DESPUÉS de relevar: la
145
+ // pasada aplicaba y marcaba entradas y el comando reventaba con un
146
+ // TypeError sin decir qué había aplicado.
147
+ if (this.maxAge !== undefined && !(Number.isInteger(this.maxAge) && this.maxAge >= 0)) {
148
+ this.logger.error(`--max-age debe ser un entero >= 0 en milisegundos (llegó ${String(this.maxAge)}). No se ha relevado nada.`);
149
+ this.exitCode = 1;
150
+ return;
151
+ }
143
152
  const report = await authorization.relayScopeChanges({
144
153
  dryRun: this.dryRun === true,
145
154
  limit: this.limit,
@@ -165,6 +174,34 @@ export default class AuthzScopesRelay extends BaseCommand {
165
174
  for (const item of report.dead) {
166
175
  this.logger.error(`APARCADO tras agotar los intentos: ${linea(item)}${item.error ? ` — ${item.error}` : ''}`);
167
176
  }
177
+ // Cierre-2 · C2 (gemelo): un id PEDIDO aparcado más allá del primer lote de
178
+ // `dead` (acotado a `batchSize`) llega en `entries`; se nombra igual.
179
+ if (only !== undefined) {
180
+ const listed = new Set(report.dead.map((item) => String(item.id)));
181
+ for (const entry of report.entries) {
182
+ if (entry.status !== 'dead' || listed.has(String(entry.id)))
183
+ continue;
184
+ this.logger.error(`APARCADO tras agotar los intentos: ${linea(entry)}${entry.reason ? ` — ${entry.reason}` : ''}`);
185
+ this.exitCode = 1;
186
+ }
187
+ }
188
+ // Cierre-2 · C2: `missing` (no está en la cola) ≠ `notEvaluated` (PENDIENTE y
189
+ // la pasada no llegó: alcanzó --limit). Hasta el cierre-2 los dos salían como
190
+ // «no estaba ni pendiente ni aparcado … o no existe», con exit 0.
191
+ const notEvaluated = only === undefined ? [] : (report.notEvaluated ?? []);
192
+ const limite = this.limit === undefined ? 'el --limit por defecto' : `--limit=${this.limit}`;
193
+ const rama = report.dryRun ? '--dry-run' : 'pasada que aplica';
194
+ const notEvaluatedLines = () => {
195
+ if (notEvaluated.length === 0)
196
+ return;
197
+ for (const id of notEvaluated) {
198
+ this.logger.error(`#${id} está PENDIENTE y esta pasada NO lo evaluó (${rama}): alcanzó ${limite} antes de llegar a él. ` +
199
+ (report.dryRun ? 'No se sabe si se aplicaría.' : 'No se ha aplicado: el cambio no ha aterrizado.'));
200
+ }
201
+ this.logger.error(`${notEvaluated.length} de los ids pedidos NO se evaluaron por el límite de la pasada ` +
202
+ `(${notEvaluated.map((id) => `#${id}`).join(', ')}): repite con un --limit mayor (o sin él).`);
203
+ this.exitCode = 1;
204
+ };
168
205
  if (report.dead.length > 0) {
169
206
  this.logger.warning('Una entrada aparcada NO se va a aplicar sola: el árbol del backend está divergente en ese nodo. ' +
170
207
  'Revísala en la cola (el consumidor puede volver a notificar el cambio) o reconcilia.');
@@ -178,15 +215,38 @@ export default class AuthzScopesRelay extends BaseCommand {
178
215
  if (report.dryRun) {
179
216
  for (const item of report.wouldApply)
180
217
  this.logger.log(`pendiente: ${linea(item)}`);
218
+ // Cierre del auditor de alpha.10 · R3 (gemelo de S6 en --dry-run): con
219
+ // `--only` la pregunta es «¿qué fue de LO PEDIDO?» también aquí. Hasta el
220
+ // cierre esta rama retornaba antes del bloque S6 y `--dry-run --only=999`
221
+ // (errata) decía «La outbox del árbol está vacía» en verde sin nombrar el id.
222
+ // Misma letra por id que la pasada que aplica; el resumen dice su rama.
223
+ if (only !== undefined) {
224
+ for (const id of report.missing) {
225
+ this.logger.warning(`#${id} no estaba ni pendiente ni aparcado: ya lo aplicó otra pasada, o no existe.`);
226
+ }
227
+ notEvaluatedLines();
228
+ }
181
229
  if (report.wouldApply.length === 0) {
182
230
  if (report.dead.length > 0)
183
231
  this.exitCode = 1;
184
- else
232
+ if (only !== undefined) {
233
+ if (report.missing.length > 0 && notEvaluated.length === 0) {
234
+ this.logger.warning(`--dry-run: ninguno de los ids pedidos está pendiente (${report.missing.map((id) => `#${id}`).join(', ')}: ` +
235
+ 'ni pendientes ni aparcados). No hay nada de LO PEDIDO que propagar; si no los aplicó otra pasada, revisa los ids.');
236
+ }
237
+ return;
238
+ }
239
+ if (report.dead.length === 0)
185
240
  this.logger.success('La outbox del árbol está vacía: nada que propagar.');
186
241
  return;
187
242
  }
188
243
  this.logger.warning(`${report.wouldApply.length} cambio(s) del árbol sin propagar. No se ha aplicado nada: repite sin --dry-run. ` +
189
244
  `Mientras tanto el backend decide con el árbol VIEJO.`);
245
+ // alpha.10 · S5: lo APARCADO es exit ≠ 0 «mientras exista» (README), haya
246
+ // o no pendientes. Hasta alpha.9 un cron con --dry-run perdía la
247
+ // divergencia permanente justo cuando además había tráfico.
248
+ if (report.dead.length > 0)
249
+ this.exitCode = 1;
190
250
  return;
191
251
  }
192
252
  // Qué fue de cada entrada, una a una (`entries`): la pasada no es atómica
@@ -204,6 +264,7 @@ export default class AuthzScopesRelay extends BaseCommand {
204
264
  for (const id of report.missing) {
205
265
  this.logger.warning(`#${id} no estaba ni pendiente ni aparcado: ya lo aplicó otra pasada, o no existe.`);
206
266
  }
267
+ notEvaluatedLines();
207
268
  if (report.failures.length > 0) {
208
269
  for (const item of report.failures) {
209
270
  this.logger.error(`falló #${item.id} (${item.change.op} ` +
@@ -218,6 +279,25 @@ export default class AuthzScopesRelay extends BaseCommand {
218
279
  }
219
280
  if (report.dead.length > 0)
220
281
  this.exitCode = 1;
282
+ // alpha.10 · S6: con `--only` la pregunta es «¿aterrizó LO QUE PEDÍ?», no
283
+ // «¿está vacía la cola?». Hasta alpha.9 un id aplazado (o una errata)
284
+ // imprimía «La outbox del árbol está vacía» en verde: el script de alta de
285
+ // tenant daba por relevado un cambio que no había aterrizado.
286
+ if (only !== undefined) {
287
+ const deferred = report.entries.filter((entry) => entry.status === 'deferred');
288
+ if (deferred.length > 0) {
289
+ this.logger.error(`${deferred.length} de los ids pedidos NO se ha aplicado (aplazado, arriba el motivo): ` +
290
+ `${deferred.map((entry) => `#${entry.id}`).join(', ')}. El cambio no ha aterrizado en el backend.`);
291
+ this.exitCode = 1;
292
+ }
293
+ if (report.applied.length === 0) {
294
+ if (deferred.length === 0 && notEvaluated.length === 0 && report.missing.length > 0) {
295
+ this.logger.warning(`Ninguno de los ids pedidos se ha aplicado en esta pasada (${report.missing.map((id) => `#${id}`).join(', ')}: ` +
296
+ 'ni pendientes ni aparcados). Si no los aplicó otra pasada, revisa los ids.');
297
+ }
298
+ return;
299
+ }
300
+ }
221
301
  if (report.applied.length === 0) {
222
302
  if (report.dead.length === 0)
223
303
  this.logger.success('La outbox del árbol está vacía: nada que propagar.');
@@ -231,7 +311,6 @@ export default class AuthzScopesRelay extends BaseCommand {
231
311
  }
232
312
  __decorate([
233
313
  flags.boolean({
234
- name: 'dry-run',
235
314
  description: 'List the pending tree changes without applying any of them',
236
315
  }),
237
316
  __metadata("design:type", Object)
@@ -241,26 +320,23 @@ __decorate([
241
320
  __metadata("design:type", Object)
242
321
  ], AuthzScopesRelay.prototype, "limit", void 0);
243
322
  __decorate([
244
- flags.number({ name: 'batch-size', description: 'How many pending changes to read per round trip' }),
323
+ flags.number({ description: 'How many pending changes to read per round trip' }),
245
324
  __metadata("design:type", Object)
246
325
  ], AuthzScopesRelay.prototype, "batchSize", void 0);
247
326
  __decorate([
248
327
  flags.array({
249
- name: 'only',
250
328
  description: 'Apply ONLY these outbox ids (the receipt of scopes.*), comma-separated or repeated; dependencies are deferred, never skipped',
251
329
  }),
252
330
  __metadata("design:type", Object)
253
331
  ], AuthzScopesRelay.prototype, "only", void 0);
254
332
  __decorate([
255
333
  flags.number({
256
- name: 'wait-lease-ms',
257
334
  description: 'Wait up to this many ms for the relay lease instead of reporting busy at once (default 0; needs a pool >= 2)',
258
335
  }),
259
336
  __metadata("design:type", Object)
260
337
  ], AuthzScopesRelay.prototype, "waitLeaseMs", void 0);
261
338
  __decorate([
262
339
  flags.number({
263
- name: 'max-age',
264
340
  description: 'Exit ≠ 0 if the oldest pending entry of the whole queue is older than this many ms (without it the age is only reported)',
265
341
  }),
266
342
  __metadata("design:type", Object)