@jantstack/adonis-authz 2.5.0-alpha.1 → 2.5.0-alpha.3

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 (103) hide show
  1. package/README.md +515 -22
  2. package/build/commands/authz_relations_reconcile.d.ts +13 -62
  3. package/build/commands/authz_relations_reconcile.d.ts.map +1 -1
  4. package/build/commands/authz_relations_reconcile.js +202 -116
  5. package/build/commands/authz_relations_reconcile.js.map +1 -1
  6. package/build/commands/openfga_provision.d.ts +62 -0
  7. package/build/commands/openfga_provision.d.ts.map +1 -1
  8. package/build/commands/openfga_provision.js +193 -1
  9. package/build/commands/openfga_provision.js.map +1 -1
  10. package/build/index.d.ts +6 -6
  11. package/build/index.d.ts.map +1 -1
  12. package/build/index.js +3 -3
  13. package/build/index.js.map +1 -1
  14. package/build/providers/authz_provider.d.ts.map +1 -1
  15. package/build/providers/authz_provider.js +4 -1
  16. package/build/providers/authz_provider.js.map +1 -1
  17. package/build/src/define_config.d.ts +32 -0
  18. package/build/src/define_config.d.ts.map +1 -1
  19. package/build/src/define_config.js +109 -0
  20. package/build/src/define_config.js.map +1 -1
  21. package/build/src/drivers/database_relations_driver.d.ts +36 -1
  22. package/build/src/drivers/database_relations_driver.d.ts.map +1 -1
  23. package/build/src/drivers/database_relations_driver.js +213 -46
  24. package/build/src/drivers/database_relations_driver.js.map +1 -1
  25. package/build/src/drivers/openfga_driver.d.ts +30 -4
  26. package/build/src/drivers/openfga_driver.d.ts.map +1 -1
  27. package/build/src/drivers/openfga_driver.js +151 -45
  28. package/build/src/drivers/openfga_driver.js.map +1 -1
  29. package/build/src/drivers/openfga_facts.d.ts +21 -0
  30. package/build/src/drivers/openfga_facts.d.ts.map +1 -1
  31. package/build/src/drivers/openfga_facts.js +74 -8
  32. package/build/src/drivers/openfga_facts.js.map +1 -1
  33. package/build/src/drivers/openfga_relations_driver.d.ts +140 -10
  34. package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -1
  35. package/build/src/drivers/openfga_relations_driver.js +743 -49
  36. package/build/src/drivers/openfga_relations_driver.js.map +1 -1
  37. package/build/src/errors.d.ts +148 -0
  38. package/build/src/errors.d.ts.map +1 -1
  39. package/build/src/errors.js +166 -0
  40. package/build/src/errors.js.map +1 -1
  41. package/build/src/manager.d.ts.map +1 -1
  42. package/build/src/manager.js +15 -5
  43. package/build/src/manager.js.map +1 -1
  44. package/build/src/openfga.d.ts +1 -1
  45. package/build/src/openfga.d.ts.map +1 -1
  46. package/build/src/openfga.js +1 -1
  47. package/build/src/openfga.js.map +1 -1
  48. package/build/src/relations/check_many.d.ts +1 -1
  49. package/build/src/relations/check_many.d.ts.map +1 -1
  50. package/build/src/relations/check_many.js +6 -4
  51. package/build/src/relations/check_many.js.map +1 -1
  52. package/build/src/relations/define_relations_config.d.ts +187 -1
  53. package/build/src/relations/define_relations_config.d.ts.map +1 -1
  54. package/build/src/relations/define_relations_config.js +395 -7
  55. package/build/src/relations/define_relations_config.js.map +1 -1
  56. package/build/src/relations/manager.d.ts +33 -2
  57. package/build/src/relations/manager.d.ts.map +1 -1
  58. package/build/src/relations/manager.js +123 -4
  59. package/build/src/relations/manager.js.map +1 -1
  60. package/build/src/relations/reconcile.d.ts +295 -13
  61. package/build/src/relations/reconcile.d.ts.map +1 -1
  62. package/build/src/relations/reconcile.js +886 -85
  63. package/build/src/relations/reconcile.js.map +1 -1
  64. package/build/src/relations/tuple_order.d.ts +126 -0
  65. package/build/src/relations/tuple_order.d.ts.map +1 -0
  66. package/build/src/relations/tuple_order.js +598 -0
  67. package/build/src/relations/tuple_order.js.map +1 -0
  68. package/build/src/relations_config_store.d.ts.map +1 -1
  69. package/build/src/relations_config_store.js +29 -7
  70. package/build/src/relations_config_store.js.map +1 -1
  71. package/build/src/relations_reconcile.d.ts +79 -0
  72. package/build/src/relations_reconcile.d.ts.map +1 -0
  73. package/build/src/relations_reconcile.js +85 -0
  74. package/build/src/relations_reconcile.js.map +1 -0
  75. package/build/src/scope_outbox.d.ts +9 -5
  76. package/build/src/scope_outbox.d.ts.map +1 -1
  77. package/build/src/scope_outbox.js +7 -4
  78. package/build/src/scope_outbox.js.map +1 -1
  79. package/build/src/shared/backend_guard.d.ts +8 -0
  80. package/build/src/shared/backend_guard.d.ts.map +1 -1
  81. package/build/src/shared/backend_guard.js +15 -0
  82. package/build/src/shared/backend_guard.js.map +1 -1
  83. package/build/src/testing/main.d.ts +1 -1
  84. package/build/src/testing/main.d.ts.map +1 -1
  85. package/build/src/testing/main.js +1 -1
  86. package/build/src/testing/main.js.map +1 -1
  87. package/build/src/testing/relations_contract.d.ts +18 -0
  88. package/build/src/testing/relations_contract.d.ts.map +1 -1
  89. package/build/src/testing/relations_contract.js +895 -45
  90. package/build/src/testing/relations_contract.js.map +1 -1
  91. package/build/src/testing/relations_reconcile_contract.d.ts +9 -0
  92. package/build/src/testing/relations_reconcile_contract.d.ts.map +1 -1
  93. package/build/src/testing/relations_reconcile_contract.js +207 -0
  94. package/build/src/testing/relations_reconcile_contract.js.map +1 -1
  95. package/build/src/testing/scope_outbox_contract.d.ts +14 -1
  96. package/build/src/testing/scope_outbox_contract.d.ts.map +1 -1
  97. package/build/src/testing/scope_outbox_contract.js +126 -48
  98. package/build/src/testing/scope_outbox_contract.js.map +1 -1
  99. package/build/src/types.d.ts +90 -6
  100. package/build/src/types.d.ts.map +1 -1
  101. package/build/src/types.js +2 -0
  102. package/build/src/types.js.map +1 -1
  103. package/package.json +2 -1
@@ -1,66 +1,6 @@
1
1
  import { BaseCommand } from '@adonisjs/core/ace';
2
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>;
3
+ import type { RelationsReconcileReport } from '../src/relations/reconcile.js';
64
4
  /**
65
5
  * Cómo se nombra la ventana en la que corrió la pasada (2.4.0-alpha.10 · 3):
66
6
  * la del OPERADOR dice si caduca y cuándo — hasta alpha.9 una ventana abierta
@@ -87,7 +27,12 @@ export declare function frozenWindowLabel(frozen: {
87
27
  *
88
28
  * `extra` en una pasada que SÍ escribe (sin `--prune`) se AVISA —«repite con
89
29
  * --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.
30
+ * que `authz:reconcile` de roles con la ventana del relay. **Salvo el residuo
31
+ * del destino que nadie borra** (`invalid-identity`, `userset-unsupported` y,
32
+ * desde el cierre 3 · 🟠 N9, `undeclared` — la fila cuya relación o tipo el
33
+ * destino ya no declara; cierre 2 del lote B · 🟡 N3): ése es deriva con o sin
34
+ * `--prune`, y el consejo solo cuenta lo que `--prune` borraría de verdad y
35
+ * solo si no se pasó.
91
36
  */
92
37
  export declare function relationsReconcileLines(report: RelationsReconcileReport): {
93
38
  lines: Array<{
@@ -96,6 +41,12 @@ export declare function relationsReconcileLines(report: RelationsReconcileReport
96
41
  }>;
97
42
  clean: boolean;
98
43
  };
44
+ /**
45
+ * **La pasada que revienta A MITAD dice qué quedó escrito, por partición** (plan 2.5 · lote D · D2; roadmap 2.5, 🟡 3
46
+ * del auditor de alpha.6): con el reporte parcial que viaja en el error (`error.report`, `partial: true`). Prefijo
47
+ * ESTABLE «pasada PARCIAL:» (punto 7). Función PURA.
48
+ */
49
+ export declare function partialReportLines(report: RelationsReconcileReport): string[];
99
50
  /**
100
51
  * **`authz:relations:reconcile`** (Fase 4, lote 4-6) — migra las tuplas de
101
52
  * RELACIÓN de un `RelationsDriver` a otro, idempotente y bidireccional, nunca
@@ -1 +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,CA8KA;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;CAyJV"}
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,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAO7E;;;;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;;;;;;;;;;;;;;;;;;;;;;GAsBG;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,CA+QA;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,EAAE,CAoB7E;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;CAyNV"}
@@ -8,90 +8,11 @@ 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';
12
- /**
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.
23
- */
24
- export async function runRelationsReconcile(authorization, options) {
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
- };
79
- if (options.dryRun === true)
80
- return mark(await pass());
81
- const reason = `authz:relations:reconcile --to=${toKey}`;
82
- return authorization.withFrozenWrites(reason, async (window) => {
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
- };
92
- return report;
93
- }, { kind: 'reconcile', operatorAsContext: true });
94
- }
11
+ import { RELATION_USERSET_RESIDUE_DELETE } from '../src/relations/define_relations_config.js';
12
+ import { RelationConfigError } from '../src/errors.js';
13
+ // Plan 2.5 · lote B · B7: la vía pública vive en su subpath (`src/relations_reconcile.ts`,
14
+ // `@jantstack/adonis-authz/relations/reconcile`); este módulo es el COMANDO y la importa de allí.
15
+ import { runRelationsReconcile } from '../src/relations_reconcile.js';
95
16
  /**
96
17
  * Cómo se nombra la ventana en la que corrió la pasada (2.4.0-alpha.10 · 3):
97
18
  * la del OPERADOR dice si caduca y cuándo — hasta alpha.9 una ventana abierta
@@ -128,7 +49,12 @@ export function frozenWindowLabel(frozen) {
128
49
  *
129
50
  * `extra` en una pasada que SÍ escribe (sin `--prune`) se AVISA —«repite con
130
51
  * --prune»— pero no tumba: el operador eligió no podar. Es la misma cortesía
131
- * que `authz:reconcile` de roles con la ventana del relay.
52
+ * que `authz:reconcile` de roles con la ventana del relay. **Salvo el residuo
53
+ * del destino que nadie borra** (`invalid-identity`, `userset-unsupported` y,
54
+ * desde el cierre 3 · 🟠 N9, `undeclared` — la fila cuya relación o tipo el
55
+ * destino ya no declara; cierre 2 del lote B · 🟡 N3): ése es deriva con o sin
56
+ * `--prune`, y el consejo solo cuenta lo que `--prune` borraría de verdad y
57
+ * solo si no se pasó.
132
58
  */
133
59
  export function relationsReconcileLines(report) {
134
60
  const lines = [];
@@ -137,6 +63,27 @@ export function relationsReconcileLines(report) {
137
63
  message: `relaciones: escritas ${report.written}, actualizadas ${report.updated}, borradas ${report.deleted}, ` +
138
64
  `iguales ${report.unchanged}, sobran ${report.extra}`,
139
65
  });
66
+ // Lote D · D2: los denies, en su PROPIA línea (prefijo estable «denies:»), solo si la pasada tocó o vio alguno. Los
67
+ // contadores de arriba son allows + denies; esta línea es el subconjunto (analista §4.7).
68
+ const denies = report.denies;
69
+ if (denies && Object.values(denies).some((n) => n > 0)) {
70
+ lines.push({
71
+ level: 'log',
72
+ message: `denies: escritos ${denies.written}, rehechos ${denies.updated}, borrados ${denies.deleted}, ` +
73
+ `iguales ${denies.unchanged}, sobran ${denies.extra}`,
74
+ });
75
+ }
76
+ // Lote D · D2 (S6/R2-5): un deny que la pasada NO puede migrar. Solo llega en `--dry-run` (la real lanza 500 con la
77
+ // misma letra): es DERIVA, una línea por tipo/relación y motivo, con el prefijo ESTABLE «deny NO migrable».
78
+ for (const refusal of report.denyRefused ?? []) {
79
+ lines.push({
80
+ level: 'error',
81
+ message: `deny NO migrable (${refusal.reason}) ${refusal.objectType}#${refusal.relation}: ${refusal.message}. ` +
82
+ 'La pasada real se NIEGA (500 E_AUTHZ_DENY_MIGRATION_REFUSED) sin escribir nada — ni los allows: escribirlos sin ' +
83
+ // Cierre 1 de D2 · 🟡 6: la receta de SU motivo (la decide el plan, `refusal.recipe`), no una genérica.
84
+ `el deny concedería lo que el origen niega. Receta: ${refusal.recipe}`,
85
+ });
86
+ }
140
87
  // R-15: la caducada del origen es la pérdida DECLARADA de la migración (como
141
88
  // `expired` en roles, 3b-8 · B2): se dice, no es deriva.
142
89
  if (report.skipped.expired > 0) {
@@ -166,46 +113,94 @@ export function relationsReconcileLines(report) {
166
113
  });
167
114
  }
168
115
  // ⚪ 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;
116
+ // que destruye») + cierre 1 (🟠 1/🟠 2) y cierre 2 (🟡 N3, UNIFICACIÓN) del lote
117
+ // B: lo enumerado con una identidad fuera de la gramática (`invalid-identity`)
118
+ // y el residuo pre-2.5 de B3 (`userset-unsupported`), UNA línea por tupla con
119
+ // su lado y su porqué. Nunca fue una pregunta del llamante (invariante 5), así
120
+ // que nunca es un 422 que tumbe la pasada. Y UNA regla para los dos motivos
121
+ // (coordinador, 2026-10-15): un residuo del DESTINO que ningún driver del
122
+ // paquete borra se lista con `error` y el prefijo ESTABLE «sobra (<motivo>)
123
+ // destino:», es deriva (exit ≠ 0) en los CUATRO modos (prune × dry-run)
124
+ // —ninguna bandera lo toca: nunca un DELETE de plataforma ni un `unrelate`
125
+ // que los drivers del paquete rechazarían (R-16)—, dice «--prune NO lo borra»
126
+ // (`pruned: false`, con --prune) o «tampoco lo borraría» (sin --prune), lleva
127
+ // la receta y JAMÁS «repite con --prune». El del ORIGEN no se migra: deriva, a
128
+ // mano. Hasta el cierre 2, `invalid-identity` sin --prune era un warning con
129
+ // exit 0 y el consejo falso «repite con --prune» (que tampoco lo quitaba).
130
+ // El verificador queda rojo HASTA que se ejecute la receta — y dice qué y cómo.
131
+ let destResidue = 0;
132
+ let pendingRenewals = 0;
180
133
  for (const detail of report.details ?? []) {
181
134
  const what = `(${detail.reason}) ${detail.side}: ${detail.tuple} — ${detail.message}`;
182
135
  if (detail.side === 'origen') {
183
136
  lines.push({
184
137
  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.`,
138
+ message: detail.reason === 'userset-unsupported'
139
+ ? `sin migrar ${what}. Es un residuo pre-2.5 (B3) del store de ORIGEN: el destino no lo admite por ninguna puerta y ningún --prune lo toca. Bórrala a mano (los tres motores): ${RELATION_USERSET_RESIDUE_DELETE} y repite la pasada.`
140
+ : `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
141
  });
187
142
  continue;
188
143
  }
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
- });
144
+ if (detail.reason === 'renewal-unsafe') {
145
+ // Cierre 2 de D2 · 🟠 N1: la membresía NO se renovó (su grupo transporta un deny y el destino renueva con dos
146
+ // Write). Deriva con su receta; prefijo ESTABLE «sin renovar (renewal-unsafe) destino:» (punto 7).
147
+ pendingRenewals += 1;
148
+ lines.push({ level: 'error', message: `sin renovar ${what}.` });
196
149
  continue;
197
150
  }
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
- });
151
+ if (detail.pruned === true) {
152
+ // El paquete ya no lo emite (cierre 2 · N3): un reporte de un harness de terceros anterior.
153
+ lines.push({ level: 'log', message: `BORRADA por --prune ${what}.` });
204
154
  continue;
205
155
  }
156
+ destResidue += 1;
157
+ const verdict = detail.pruned === false ? 'NO' : 'tampoco';
158
+ // Cierre 3 del lote B · 🟠 N9: el tercer motivo, con el MISMO prefijo estable
159
+ // «sobra (<motivo>) destino:» (punto 7). La fila cuya relación (o tipo) el
160
+ // DESTINO ya no declara: `unrelate` la rechaza por F-05, así que ningún
161
+ // --prune la borra; la receta es retirarla a mano O volver a declarar la
162
+ // relación en el destino (y re-guardar la config persistida), y repetir.
163
+ lines.push({
164
+ level: 'error',
165
+ message: detail.reason === 'userset-unsupported'
166
+ ? `sobra ${what}. Es un residuo pre-2.5 (B3) del DESTINO: --prune ${verdict} lo borra${detail.pruned === false ? '' : 'ría'} (nunca un DELETE de plataforma sobre una fila que la API no admite). Bórrala a mano (los tres motores): ${RELATION_USERSET_RESIDUE_DELETE} y repite la pasada.`
167
+ : detail.reason === 'deny-conditional'
168
+ ? `sobra ${what}. Es un deny CONDICIONAL del DESTINO (con caducidad, escrito fuera del paquete) que el driver destino no puede rehacer permanente (openfga no reemplaza la misma clave en un Write, M5): niega solo mientras viva (si ya venció, no niega nada) y su partición queda NEGADA (línea «partición NEGADA»: cero escrituras en ella).`
169
+ : detail.reason === 'undeclared'
170
+ ? `sobra ${what}. Es una fila del DESTINO cuya relación (o tipo) el destino YA NO declara (F-05): --prune ${verdict} la borra${detail.pruned === false ? '' : 'ría'} (unrelate la rechaza por F-05 y la pasada no insiste: nunca un DELETE de plataforma). Sigue ahí: retírala a mano (SQL/SDK) o vuelve a declarar la relación en el destino (y re-guarda su config persistida) y repite la pasada.`
171
+ : `sobra ${what}. Es un dato del DESTINO fuera de la gramática: --prune ${verdict} la borra${detail.pruned === false ? '' : 'ría'} (ningún driver del paquete la admite en unrelate, R-16, y la pasada no se la pide a nadie: nunca un DELETE de plataforma). Sigue ahí: corrígela o bórrala a mano (SQL/SDK) y repite la pasada.`,
172
+ });
173
+ }
174
+ // Cierre 5 de D2 (decisión del dueño §2026-10-16 (10), opción A): la PARTICIÓN NEGADA — ≥ 1 `renewal-unsafe` o
175
+ // `deny-conditional`: cero escrituras y cero borrados en ella; el resto migra. Deriva (exit ≠ 0) con el prefijo ESTABLE
176
+ // «partición NEGADA» (punto 7): qué partición, por qué, que su destino queda COMO ESTABA, la deriva que queda a la vista
177
+ // y la receta (honesta: sin atomicRenewal no hay forma sin ventana).
178
+ for (const refusal of report.partitionsRefused ?? []) {
179
+ const causes = refusal.causes.map((cause) => `(${cause.reason}) ${cause.tuple}`);
180
+ // Cierre 6 de D2 · ⚪ D5-3 (E3): «COMO ESTABA» no es estático — cuándo empieza a conceder el destino y qué.
181
+ const evolves = (refusal.evolves ?? []).map((e) => `a partir de ${e.at} el destino concederá a ${e.member} lo que cortan ${e.cut.join(', ')} (si otro camino se lo da; el origen lo sigue negando)`);
182
+ const later = evolves.length > 0 ? ` OJO, ese estado EVOLUCIONA: ${evolves.slice(0, 5).join('; ')}${evolves.length > 5 ? '; …' : ''}.` : '';
183
+ lines.push({
184
+ level: 'error',
185
+ message: `partición NEGADA ${refusal.partition}: ${causes.length} causa(s) que el destino no puede escribir en una escritura — ` +
186
+ `${causes.slice(0, 5).join('; ')}${causes.length > 5 ? '; …' : ''}. Cero escrituras y cero borrados en esta partición ` +
187
+ `(también en la pasada real${report.prune === true ? ' y con --prune' : ''}): su destino queda COMO ESTABA, con la deriva ` +
188
+ `previa a la vista (por escribir ${refusal.pending.write}, por renovar ${refusal.pending.update}, por borrar ` +
189
+ `${refusal.pending.delete}).${later} El resto de particiones migra. Receta: ${refusal.recipe}`,
190
+ });
191
+ }
192
+ // Cierre 2 de D2 · ⚪ N3/🟡 N3: el RESIDUO del orden — membresías de un ciclo del grafo de precedencias. El estado final
193
+ // es el correcto (no es deriva): se AVISA, con el prefijo ESTABLE «orden SIN garantía». Cierre 5 de D2 (⚪ D4-4): desde
194
+ // el cierre 4 una RENOVACIÓN de membresía entra en el grafo (en `now` ni entra ni sale: lo hace cuando vence la
195
+ // caducidad más corta), así que la letra lo dice, y dice que el corte puede conceder en un instante POSTERIOR.
196
+ if ((report.orderResidue?.length ?? 0) > 0) {
206
197
  lines.push({
207
198
  level: 'warning',
208
- message: `sobra ${what}: nadie del origen puede respaldarla; repite con --prune para pedir su borrado.`,
199
+ message: `orden SIN garantía: ${report.orderResidue.length} membresía(s) de esta pasada se contradicen en el orden (el mismo ` +
200
+ 'sujeto entra o sale de grupos que se cortan entre sí —o una RENOVACIÓN, que entra o sale cuando vence la caducidad ' +
201
+ 'más corta—: cada uno trae un deny que corta un allow del otro); un corte entre ellas puede conceder, ya o en un ' +
202
+ 'instante posterior, lo que ni el estado inicial ni el final concedían en ese instante. El estado final es el ' +
203
+ `correcto. Si eso importa, aplícalas en dos pasadas. (${report.orderResidue.slice(0, 5).join('; ')}${report.orderResidue.length > 5 ? '; …' : ''})`,
209
204
  });
210
205
  }
211
206
  // R-17: el seguro de borrado masivo. En una pasada REAL sin --allow-mass-delete
@@ -235,10 +230,16 @@ export function relationsReconcileLines(report) {
235
230
  'E_AUTHZ_MASS_RECONCILE_REFUSED; si de verdad quieres vaciar el destino, --allow-mass-delete.',
236
231
  });
237
232
  }
238
- if (report.extra > 0 && !report.dryRun) {
233
+ // Cierre 2 del lote B · 🟡 N3: el consejo «repite con --prune» SOLO cuando no
234
+ // se pasó `--prune` (el reporte lo lleva; ausente = no pasado) Y queda algo
235
+ // que `--prune` borra DE VERDAD: `extra` menos el residuo del destino que nadie
236
+ // borra. Hasta el cierre 2 salía con `extra > 0` a secas, justo debajo de la
237
+ // línea «--prune NO lo borra» de una pasada que YA llevaba --prune.
238
+ const prunable = report.extra - destResidue;
239
+ if (prunable > 0 && !report.dryRun && report.prune !== true) {
239
240
  lines.push({
240
241
  level: 'warning',
241
- message: `${report.extra} tupla(s) del destino que el origen ya no respalda siguen ahí (no pasaste --prune): ` +
242
+ message: `${prunable} tupla(s) del destino que el origen ya no respalda siguen ahí (no pasaste --prune): ` +
242
243
  'repite con --prune si quieres borrarlas.',
243
244
  });
244
245
  }
@@ -281,12 +282,38 @@ export function relationsReconcileLines(report) {
281
282
  report.modelDrift.length === 0 &&
282
283
  report.skipped.undeclared === 0 &&
283
284
  (report.skipped.invalid ?? 0) === 0 &&
284
- invalidRefused === 0 &&
285
+ (report.skipped.usersetUnsupported ?? 0) === 0 &&
286
+ destResidue === 0 &&
287
+ pendingRenewals === 0 &&
288
+ (report.partitionsRefused?.length ?? 0) === 0 &&
289
+ (report.denyRefused?.length ?? 0) === 0 &&
285
290
  !(report.massDelete && !massDeleteLifted) &&
286
291
  !(report.frozen?.lapsed === true) &&
287
292
  (!report.dryRun || cambios === 0);
288
293
  return { lines, clean };
289
294
  }
295
+ /**
296
+ * **La pasada que revienta A MITAD dice qué quedó escrito, por partición** (plan 2.5 · lote D · D2; roadmap 2.5, 🟡 3
297
+ * del auditor de alpha.6): con el reporte parcial que viaja en el error (`error.report`, `partial: true`). Prefijo
298
+ * ESTABLE «pasada PARCIAL:» (punto 7). Función PURA.
299
+ */
300
+ export function partialReportLines(report) {
301
+ const lines = [
302
+ `pasada PARCIAL: escritas ${report.written}, actualizadas ${report.updated}, borradas ${report.deleted} antes del fallo ` +
303
+ '(la pasada es idempotente: repítela para terminar).',
304
+ ];
305
+ // Cierre 2 de D2 · 🟠 N1: la escritura que FALLÓ ya había aplicado parte — una renovación de `openfga` (delete + write)
306
+ // cuyo write no entró: los contadores no la cuentan, pero el destino CAMBIÓ (jamás «sin escribir nada»).
307
+ if (report.written + report.updated + report.deleted === 0) {
308
+ lines.push('pasada PARCIAL: la escritura que falló YA había aplicado parte (una renovación del destino: el delete entró y el write ' +
309
+ 'no) — el destino CAMBIÓ aunque los contadores digan 0; repite la pasada.');
310
+ }
311
+ for (const row of report.partitions ?? []) {
312
+ lines.push(`pasada PARCIAL: partición ${row.partition} · ${row.status === 'done' ? 'TERMINADA' : row.status === 'failed' ? 'REVENTÓ aquí' : row.status === 'refused' ? 'NEGADA (cero escrituras)' : 'sin tocar'}` +
313
+ ` (escritas ${row.written}, actualizadas ${row.updated}, borradas ${row.deleted}; denies escritos ${row.denies.written})`);
314
+ }
315
+ return lines;
316
+ }
290
317
  /**
291
318
  * **`authz:relations:reconcile`** (Fase 4, lote 4-6) — migra las tuplas de
292
319
  * RELACIÓN de un `RelationsDriver` a otro, idempotente y bidireccional, nunca
@@ -396,8 +423,44 @@ export default class AuthzRelationsReconcile extends BaseCommand {
396
423
  : { type: 'app', uuid: null };
397
424
  // La config del DESTINO, para vigilar la deriva del modelo fusionado en
398
425
  // --dry-run: es la persistida (una sola en el store compartido).
426
+ // **Plan 2.5 · lote B · B5** (analista §4.7, auditor R2-5; linaje L5): hasta
427
+ // 2.5.0-alpha.1 era `readRelationsConfig().catch(() => undefined)` — un
428
+ // FALLO de lectura seguía sin config y en silencio (sin vigilar la deriva;
429
+ // con el deny, sin la puerta del 500 del plan). Tres ramas, cada una con su
430
+ // línea: fallo ⇒ error + exit 1 ANTES de construir, congelar o escribir;
431
+ // `null` («no hay config persistida», relaciones opt-in) ⇒ sigue y lo dice;
432
+ // leída ⇒ sigue y lo dice.
399
433
  const { readRelationsConfig } = await import('../src/relations_config_store.js');
400
- const toConfig = await readRelationsConfig().catch(() => undefined);
434
+ let toConfig;
435
+ try {
436
+ toConfig = await readRelationsConfig();
437
+ }
438
+ catch (error) {
439
+ // Cierre 1 del lote B · 🟡 7: la fila persistida EXISTE y se leyó, pero NO
440
+ // valida en 2.5 (clave desconocida de B2, ciclo de B1, JSON corrupto…):
441
+ // antes de 2.5 `saveRelationsConfig` guardaba el spec TAL CUAL, claves
442
+ // tiradas en silencio incluidas. No es «la lectura falló» (503): es su
443
+ // propia rama, con su línea y el paso que la arregla.
444
+ if (error instanceof RelationConfigError) {
445
+ this.logger.error(`La config de relaciones persistida en authz_relations_config NO valida en 2.5: ${String(error?.message ?? error)} ` +
446
+ `Es una fila escrita por una versión anterior (que descartaba claves en silencio) o a mano. Re-guárdala con ` +
447
+ `saveRelationsConfig(<spec corregida>) —la spec, no la config ya definida— desde un proceso con la config ` +
448
+ `estática buena, y repite la pasada. No se ha construido, congelado ni escrito nada.`);
449
+ this.exitCode = 1;
450
+ return;
451
+ }
452
+ this.logger.error(`No se pudo leer la config de relaciones persistida del destino (authz_relations_config): ` +
453
+ `${String(error?.message ?? error)}. Una lectura que falla NO es «no hay config»: sin ella la pasada no ` +
454
+ `vigilaría la deriva del modelo del destino y escribiría a ciegas. No se ha construido, congelado ni escrito nada.`);
455
+ this.exitCode = 1;
456
+ return;
457
+ }
458
+ if (toConfig === null) {
459
+ this.logger.info('Config del destino: ninguna persistida en authz_relations_config (relaciones opt-in): la deriva del modelo NO se vigila en esta pasada.');
460
+ }
461
+ else {
462
+ this.logger.info(`Config del destino: leída de authz_relations_config (${toConfig.objectTypes.length} tipo(s)): la deriva del modelo se vigila.`);
463
+ }
401
464
  // L-1 · J1: la pasada que ESCRIBE corre bajo la ventana durable del
402
465
  // manager de roles (la misma fila `id = 2`, toda la flota); `--dry-run` no.
403
466
  // Los drivers los construye `runRelationsReconcile`, DESPUÉS del guard.
@@ -422,6 +485,28 @@ export default class AuthzRelationsReconcile extends BaseCommand {
422
485
  this.exitCode = 1;
423
486
  return;
424
487
  }
488
+ // Lote D · D2 (S6/R2-5): la puerta del deny del DESTINO negó la pasada en la fase de plan, con CERO escrituras.
489
+ // La letra del error empieza por el prefijo estable «deny NO migrable:».
490
+ if (error?.code === 'E_AUTHZ_DENY_MIGRATION_REFUSED') {
491
+ this.logger.error(String(error.message ?? error));
492
+ this.exitCode = 1;
493
+ return;
494
+ }
495
+ // Lote D · D2: la pasada reventó A MITAD — el reporte parcial por partición viaja en el error.
496
+ if (error?.report?.partial === true) {
497
+ for (const line of partialReportLines(error.report))
498
+ this.logger.error(line);
499
+ this.logger.error(String(error?.message ?? error));
500
+ this.exitCode = 1;
501
+ return;
502
+ }
503
+ // ⚪ 10 (cierre 1 de D2): reventó ANTES de escribir nada — el reporte viaja con `partial: false`. La línea del
504
+ // error con su prefijo ESTABLE, sin «PARCIAL» (la marca de escritura parcial tampoco está).
505
+ if (error?.report && error.report.partial === false) {
506
+ this.logger.error(`pasada FALLIDA sin escribir nada: ${String(error?.message ?? error)} (la pasada es idempotente: repítela).`);
507
+ this.exitCode = 1;
508
+ return;
509
+ }
425
510
  // L-1 · J1: un freeze vivo de OTRA pasada (423): dos migraciones no se
426
511
  // pisan; el mensaje nombra al dueño y cómo se levanta.
427
512
  if (error?.code === 'E_AUTHZ_FREEZE_HELD' || error?.code === 'E_AUTHZ_OPERATOR_WINDOW_EXPIRED') {
@@ -444,7 +529,8 @@ export default class AuthzRelationsReconcile extends BaseCommand {
444
529
  const resumen = `escritas ${report.written}, actualizadas ${report.updated}, borradas ${report.deleted}, ` +
445
530
  `iguales ${report.unchanged}, sobran ${report.extra}, caducadas omitidas ${report.skipped.expired}, ` +
446
531
  `no declaradas en el destino ${report.skipped.undeclared}` +
447
- (report.skipped.invalid ? `, fuera de la gramática en el origen ${report.skipped.invalid}` : '');
532
+ (report.skipped.invalid ? `, fuera de la gramática en el origen ${report.skipped.invalid}` : '') +
533
+ (report.skipped.usersetUnsupported ? `, con sujeto userset no admitido en el origen ${report.skipped.usersetUnsupported}` : '');
448
534
  if (report.dryRun) {
449
535
  if (clean) {
450
536
  this.logger.success(`Sin deriva: '${this.to}' coincide con '${fromKey}' (${resumen}).`);
@@ -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":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAGvD,OAAO,EAAE,+BAA+B,EAAE,MAAM,6CAA6C,CAAA;AAC7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,2FAA2F;AAC3F,kGAAkG;AAClG,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAErE;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAIjC;IACC,2EAA2E;IAC3E,0EAA0E;IAC1E,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC5B,OAAO,wCAAwC,MAAM,CAAC,OAAO,yCAAyC,CAAA;IACxG,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,wCAAwC,CAAA;IAClF,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,OAAO,KAAK,IAAI;YAC5B,CAAC,CAAC,sCAAsC;YACxC,CAAC,CAAC,wCAAwC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,iBAAiB,MAAM,CAAC,OAAO,MAAM,CAAA;IACzH,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,OAAO,KAAK,CAAA;AAC5F,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAgC;IAItE,MAAM,KAAK,GAA+E,EAAE,CAAA;IAE5F,KAAK,CAAC,IAAI,CAAC;QACT,KAAK,EAAE,KAAK;QACZ,OAAO,EACL,wBAAwB,MAAM,CAAC,OAAO,kBAAkB,MAAM,CAAC,OAAO,cAAc,MAAM,CAAC,OAAO,IAAI;YACtG,WAAW,MAAM,CAAC,SAAS,YAAY,MAAM,CAAC,KAAK,EAAE;KACxD,CAAC,CAAA;IAEF,oHAAoH;IACpH,0FAA0F;IAC1F,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC5B,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,KAAK;YACZ,OAAO,EACL,oBAAoB,MAAM,CAAC,OAAO,cAAc,MAAM,CAAC,OAAO,cAAc,MAAM,CAAC,OAAO,IAAI;gBAC9F,WAAW,MAAM,CAAC,SAAS,YAAY,MAAM,CAAC,KAAK,EAAE;SACxD,CAAC,CAAA;IACJ,CAAC;IAED,oHAAoH;IACpH,4GAA4G;IAC5G,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,OAAO;YACd,OAAO,EACL,qBAAqB,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,OAAO,IAAI;gBACtG,kHAAkH;gBAClH,wGAAwG;gBACxG,sDAAsD,OAAO,CAAC,MAAM,EAAE;SACzE,CAAC,CAAA;IACJ,CAAC;IAED,6EAA6E;IAC7E,yDAAyD;IACzD,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,KAAK;YACZ,OAAO,EACL,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,0EAA0E;gBACnG,0EAA0E;SAC7E,CAAC,CAAA;IACJ,CAAC;IAED,6EAA6E;IAC7E,0EAA0E;IAC1E,kEAAkE;IAClE,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,OAAO;YACd,OAAO,EACL,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,gFAAgF;gBAC5G,oGAAoG;gBACpG,sEAAsE;SACzE,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,OAAO;YACd,OAAO,EACL,sBAAsB,IAAI,sEAAsE;gBAChG,uFAAuF;gBACvF,+EAA+E;SAClF,CAAC,CAAA;IACJ,CAAC;IAED,4EAA4E;IAC5E,iFAAiF;IACjF,+EAA+E;IAC/E,8EAA8E;IAC9E,+EAA+E;IAC/E,4EAA4E;IAC5E,0EAA0E;IAC1E,4EAA4E;IAC5E,wEAAwE;IACxE,2EAA2E;IAC3E,8EAA8E;IAC9E,8EAA8E;IAC9E,+EAA+E;IAC/E,6EAA6E;IAC7E,2EAA2E;IAC3E,gFAAgF;IAChF,IAAI,WAAW,GAAG,CAAC,CAAA;IACnB,IAAI,eAAe,GAAG,CAAC,CAAA;IACvB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;QACrF,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,EAAE,OAAO;gBACd,OAAO,EACL,MAAM,CAAC,MAAM,KAAK,qBAAqB;oBACrC,CAAC,CAAC,cAAc,IAAI,6JAA6J,+BAA+B,sBAAsB;oBACtO,CAAC,CAAC,cAAc,IAAI,6GAA6G;aACtI,CAAC,CAAA;YACF,SAAQ;QACV,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;YACvC,8GAA8G;YAC9G,mGAAmG;YACnG,eAAe,IAAI,CAAC,CAAA;YACpB,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,IAAI,GAAG,EAAE,CAAC,CAAA;YAC/D,SAAQ;QACV,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC3B,4FAA4F;YAC5F,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,uBAAuB,IAAI,GAAG,EAAE,CAAC,CAAA;YACrE,SAAQ;QACV,CAAC;QACD,WAAW,IAAI,CAAC,CAAA;QAChB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;QAC1D,8EAA8E;QAC9E,2EAA2E;QAC3E,wEAAwE;QACxE,yEAAyE;QACzE,yEAAyE;QACzE,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,OAAO;YACd,OAAO,EACL,MAAM,CAAC,MAAM,KAAK,qBAAqB;gBACrC,CAAC,CAAC,SAAS,IAAI,qDAAqD,OAAO,YACvE,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KACjC,4GAA4G,+BAA+B,sBAAsB;gBACnK,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,kBAAkB;oBACpC,CAAC,CAAC,SAAS,IAAI,kUAAkU;oBACjV,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,YAAY;wBAChC,CAAC,CAAC,SAAS,IAAI,6FAA6F,OAAO,YAC/G,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KACjC,kOAAkO;wBACpO,CAAC,CAAC,SAAS,IAAI,2DAA2D,OAAO,YAC7E,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KACjC,iMAAiM;SAC1M,CAAC,CAAA;IACJ,CAAC;IAED,+GAA+G;IAC/G,wHAAwH;IACxH,yHAAyH;IACzH,qEAAqE;IACrE,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC;QACrD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;QAChF,2GAA2G;QAC3G,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAC,MAAM,kBAAkB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,wDAAwD,CACxJ,CAAA;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gCAAgC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;QAC3I,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,OAAO;YACd,OAAO,EACL,oBAAoB,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,MAAM,gEAAgE;gBACvH,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,sDAAsD;gBACvH,6BAA6B,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,iDAAiD;gBAC3H,mCAAmC,OAAO,CAAC,OAAO,CAAC,KAAK,iBAAiB,OAAO,CAAC,OAAO,CAAC,MAAM,eAAe;gBAC9G,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK,2CAA2C,OAAO,CAAC,MAAM,EAAE;SACjG,CAAC,CAAA;IACJ,CAAC;IAED,wHAAwH;IACxH,uHAAuH;IACvH,gHAAgH;IAChH,+GAA+G;IAC/G,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,SAAS;YAChB,OAAO,EACL,uBAAuB,MAAM,CAAC,YAAa,CAAC,MAAM,oEAAoE;gBACtH,qHAAqH;gBACrH,kHAAkH;gBAClH,+GAA+G;gBAC/G,wDAAwD,MAAM,CAAC,YAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,YAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG;SACxJ,CAAC,CAAA;IACJ,CAAC;IAED,gFAAgF;IAChF,8EAA8E;IAC9E,0EAA0E;IAC1E,yEAAyE;IACzE,2EAA2E;IAC3E,8EAA8E;IAC9E,6EAA6E;IAC7E,gFAAgF;IAChF,MAAM,gBAAgB,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,eAAe,KAAK,IAAI,CAAA;IAC7E,IAAI,gBAAgB,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,MAAM,CAAC,MAAM;gBACpB,CAAC,CAAC,oBAAoB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,6DAA6D;oBAC/G,6GAA6G;gBAC/G,CAAC,CAAC,kFAAkF,MAAM,CAAC,OAAO,wBAAwB;oBACxH,qIAAqI;SAC1I,CAAC,CAAA;IACJ,CAAC;SAAM,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,OAAO;YACd,OAAO,EACL,oBAAoB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,qDAAqD;gBACvG,8FAA8F;gBAC9F,8FAA8F;SACjG,CAAC,CAAA;IACJ,CAAC;IAED,8EAA8E;IAC9E,4EAA4E;IAC5E,gFAAgF;IAChF,6EAA6E;IAC7E,oEAAoE;IACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,GAAG,WAAW,CAAA;IAC3C,IAAI,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,SAAS;YAChB,OAAO,EACL,GAAG,QAAQ,sFAAsF;gBACjG,0CAA0C;SAC7C,CAAC,CAAA;IACJ,CAAC;IAED,0EAA0E;IAC1E,6EAA6E;IAC7E,uEAAuE;IACvE,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,EAAE,OAAO;gBACd,OAAO,EACL,6DAA6D,MAAM,CAAC,MAAM,CAAC,KAAK,yBAAyB;oBACzG,iGAAiG;oBACjG,8DAA8D;aACjE,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,EAAE,KAAK;gBACZ,OAAO,EACL,kDAAkD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;oBACvE,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK;oBACxC,4BAA4B;aAC/B,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,mFAAmF;IACnF,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,WAAW,CAAA;QAChD,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,SAAS;YAChB,OAAO,EACL,sBAAsB,EAAE,8DAA8D,IAAI,wBAAwB;gBAClH,4GAA4G;gBAC5G,WAAW;gBACX,CAAC,OAAO;oBACN,CAAC,CAAC,iDAAiD;oBACnD,CAAC,CAAC,uFAAuF,CAAC;SAC/F,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACrG,MAAM,KAAK,GACT,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QACnF,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAC9B,MAAM,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC;QAC/B,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC;QACnC,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,IAAI,CAAC,CAAC,KAAK,CAAC;QAC9C,WAAW,KAAK,CAAC;QACjB,eAAe,KAAK,CAAC;QACrB,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC;QAC7C,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC;QACvC,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,gBAAgB,CAAC;QACzC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;QACjC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO,KAAK,CAAC,CAAC,CAAA;IACnC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAgC;IACjE,MAAM,KAAK,GAAG;QACZ,4BAA4B,MAAM,CAAC,OAAO,kBAAkB,MAAM,CAAC,OAAO,cAAc,MAAM,CAAC,OAAO,mBAAmB;YACvH,qDAAqD;KACxD,CAAA;IACD,wHAAwH;IACxH,yGAAyG;IACzG,IAAI,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QAC3D,KAAK,CAAC,IAAI,CACR,yHAAyH;YACvH,0EAA0E,CAC7E,CAAA;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CACR,6BAA6B,GAAG,CAAC,SAAS,MAAM,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,WAAW,EAAE;YACpM,cAAc,GAAG,CAAC,OAAO,kBAAkB,GAAG,CAAC,OAAO,cAAc,GAAG,CAAC,OAAO,qBAAqB,GAAG,CAAC,MAAM,CAAC,OAAO,GAAG,CAC5H,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,WAAW;IAC9D,MAAM,CAAC,WAAW,GAAG,2BAA2B,CAAA;IAChD,MAAM,CAAC,WAAW,GAAG,6FAA6F,CAAA;IAElH,MAAM,CAAC,OAAO,GAAmB;QAC/B,QAAQ,EAAE,IAAI;KACf,CAAA;IA+BD,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,mGAAmG;gBACjG,iDAAiD,CACpD,CAAA;YACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QAED,6EAA6E;QAC7E,0EAA0E;QAC1E,6EAA6E;QAC7E,4EAA4E;QAC5E,mEAAmE;QACnE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAA;QACtE,MAAM,IAAI,GAAG,aAAa,CAAC,mBAAmB,EAAE,CAAA;QAChD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,uGAAuG;gBACrG,+BAA+B,CAClC,CAAA;YACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QAED,wEAAwE;QACxE,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAA;YACpD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,0CAA0C,UAAU,CAAC,MAAM,gBAAgB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,KAAK;oBAChH,qFAAqF,CACxF,CAAA;gBACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YACD,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;QACzB,CAAC;QACD,IAAI,aAAa,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC;YAChE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,EAAE,2CAA2C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACvG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QACD,IAAI,aAAa,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;YAChE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,2CAA2C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACtG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QAED,yEAAyE;QACzE,2EAA2E;QAC3E,yEAAyE;QACzE,0EAA0E;QAC1E,uEAAuE;QACvE,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,sEAAsE;gBACpE,wGAAwG,CAC3G,CAAA;YACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QACD,yEAAyE;QACzE,2EAA2E;QAC3E,4EAA4E;QAC5E,IAAI,IAAI,CAAC,aAAa,KAAK,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,6CAA6C,IAAI,CAAC,aAAa,qCAAqC;gBAClG,iGAAiG,CACpG,CAAA;YACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,aAAa,6DAA6D,CAAC,CAAA;YACtH,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QACD,MAAM,SAAS,GACb,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,KAAK,KAAK;YAChD,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,aAAc,EAAE;YACzD,CAAC,CAAC,EAAE,IAAI,EAAE,KAAc,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QAE1C,wEAAwE;QACxE,iEAAiE;QACjE,6EAA6E;QAC7E,wEAAwE;QACxE,2EAA2E;QAC3E,4EAA4E;QAC5E,yEAAyE;QACzE,4EAA4E;QAC5E,2BAA2B;QAC3B,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAA;QAChF,IAAI,QAAyD,CAAA;QAC7D,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,mBAAmB,EAAE,CAAA;QACxC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,2EAA2E;YAC3E,wEAAwE;YACxE,uEAAuE;YACvE,uEAAuE;YACvE,sDAAsD;YACtD,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;gBACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,kFAAkF,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,GAAG;oBAClH,6GAA6G;oBAC7G,2GAA2G;oBAC3G,qFAAqF,CACxF,CAAA;gBACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,2FAA2F;gBACzF,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,uEAAuE;gBACzG,mHAAmH,CACtH,CAAA;YACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QACD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,yIAAyI,CAC1I,CAAA;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,wDAAwD,QAAQ,CAAC,WAAW,CAAC,MAAM,4CAA4C,CAChI,CAAA;QACH,CAAC;QAED,oEAAoE;QACpE,4EAA4E;QAC5E,wEAAwE;QACxE,IAAI,MAAM,CAAA;QACV,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,qBAAqB,CAAC,aAAa,EAAE;gBAClD,SAAS;gBACT,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI;gBAC5B,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI;gBAC1B,eAAe,EAAE,IAAI,CAAC,eAAe,KAAK,IAAI;gBAC9C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,KAAK,IAAI;gBAChD,KAAK,EAAE,IAAI,CAAC,EAAE;gBACd,OAAO;gBACP,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClC,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,yEAAyE;YACzE,+DAA+D;YAC/D,IAAI,KAAK,EAAE,IAAI,KAAK,gCAAgC,IAAI,KAAK,EAAE,IAAI,KAAK,8BAA8B,EAAE,CAAC;gBACvG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAA;gBACjD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YACD,gHAAgH;YAChH,yEAAyE;YACzE,IAAI,KAAK,EAAE,IAAI,KAAK,gCAAgC,EAAE,CAAC;gBACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAA;gBACjD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YACD,+FAA+F;YAC/F,IAAI,KAAK,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;gBACpC,KAAK,MAAM,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC;oBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBAC5E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC,CAAA;gBAClD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YACD,8GAA8G;YAC9G,4FAA4F;YAC5F,IAAI,KAAK,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBACpD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;gBAC/H,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YACD,uEAAuE;YACvE,uDAAuD;YACvD,IAAI,KAAK,EAAE,IAAI,KAAK,qBAAqB,IAAI,KAAK,EAAE,IAAI,KAAK,iCAAiC,EAAE,CAAC;gBAC/F,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAA;gBACjD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YACD,2EAA2E;YAC3E,wEAAwE;YACxE,IAAI,KAAK,EAAE,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAA;gBACjD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;gBACjB,OAAM;YACR,CAAC;YACD,MAAM,KAAK,CAAA;QACb,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAA;QACxD,KAAK,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,KAAK;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAA;QAEnE,MAAM,OAAO,GACX,YAAY,MAAM,CAAC,OAAO,kBAAkB,MAAM,CAAC,OAAO,cAAc,MAAM,CAAC,OAAO,IAAI;YAC1F,WAAW,MAAM,CAAC,SAAS,YAAY,MAAM,CAAC,KAAK,wBAAwB,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI;YACrG,+BAA+B,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE;YAC1D,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,wCAAwC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChG,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,iDAAiD,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACjI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,IAAI,CAAC,EAAE,mBAAmB,OAAO,MAAM,OAAO,IAAI,CAAC,CAAA;gBACvF,OAAM;YACR,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,EAAE,MAAM,OAAO,sCAAsC,CAAC,CAAA;YAC5F,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,IAAI,CAAC,EAAE,0BAA0B,OAAO,MAAM,OAAO,GAAG,CAAC,CAAA;QAC/F,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,yEAAyE,CAAC,CAAA;YAC9F,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;;AApPO;IADP,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,6EAA6E,EAAE,CAAC;;mDAC/E;AAGtB;IADP,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yFAAyF,EAAE,CAAC;;qDACzF;AAGxB;IADP,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,kEAAkE,EAAE,CAAC;;uDAChE;AAG3B;IADP,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,+DAA+D,EAAE,CAAC;;sDAC9D;AAK1B;IAHP,KAAK,CAAC,OAAO,CAAC;QACb,WAAW,EAAE,oGAAoG;KAClH,CAAC;;gEAC0C;AAMpC;IAJP,KAAK,CAAC,OAAO,CAAC;QACb,WAAW,EACT,iIAAiI;KACpI,CAAC;;iEAC2C;AAGrC;IADP,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,sEAAsE,EAAE,CAAC;;8DAC7D;AAGjC;IADP,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,+DAA+D,EAAE,CAAC;;8DACtD"}