@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
@@ -16,13 +16,127 @@
16
16
  * (`../identity.js`); JAMÁS de `../manager` ni de `../drivers/*`. Es lo que
17
17
  * mantiene `relations/` desacoplado de `roles/`.
18
18
  */
19
- import { RelationConfigError, RelationTypeUnknownError, RelationUnknownError } from '../errors.js';
19
+ import { RelationConfigError, RelationConfigUnknownKeyError, RelationNotDenyableError, RelationDenyExpiryError, RelationTypeUnknownError, RelationUnknownError, RelationUsersetUnsupportedError, } from '../errors.js';
20
20
  import { RESERVED_FACTS_TYPES, RESERVED_SLUGS, RESERVED_SLUG_PREFIXES } from '../identity.js';
21
+ /**
22
+ * **El ÚNICO userset que el modelo admite como sujeto** (plan 2.5 · lote B · B3):
23
+ * `group#member`. El generador del modelo fusionado emite, para CADA relación de
24
+ * dominio, `[<holders> with not_expired, group#member]` y nada más; `group` es el
25
+ * tipo BUILT-IN (`declared.set('group', …)` abajo) y el consumidor no lo declara.
26
+ */
27
+ export const RELATION_USERSET_TYPE = 'group';
28
+ export const RELATION_USERSET_RELATION = 'member';
21
29
  /** La cota de FGA para el nombre de una relación (50). Un tipo de objeto llega a 254. */
22
30
  const RELATION_NAME_MAX = 50;
31
+ /**
32
+ * **El prefijo de la relación ALMACENADA de un deny** (plan 2.5 · lote D · D1): `deny(u, viewer, doc)` escribe la
33
+ * tupla `doc#denied_viewer@u` —en `authz_relations` (`database`) y en el store (`openfga`)—. Es el MISMO prefijo que
34
+ * la familia del deny de roles (`FACTS_DENIED_PREFIX`) y está en `RESERVED_SLUG_PREFIXES`: ninguna relación de dominio
35
+ * puede empezar por él (⚪4), así que el nombre público y el almacenado nunca colisionan.
36
+ */
37
+ export const RELATION_DENY_PREFIX = 'denied_';
38
+ /**
39
+ * **La cota de una relación DENEGABLE** (D1, juez ronda 2 · fila D: «≤ 43 caracteres»): `denied_<rel>` tiene que caber
40
+ * en los 50 de FGA (y en la columna `relation` de `authz_relations`), así que una relación de un tipo con `deny`
41
+ * mide como mucho `50 − 'denied_'.length` = 43. DERIVADA, como `MAX_SLUG_LENGTH`. En un tipo SIN `deny` la cota sigue
42
+ * siendo 50 (D-18: una cota global sería una ruptura para quien no usa el deny).
43
+ */
44
+ export const DENIABLE_RELATION_NAME_MAX = RELATION_NAME_MAX - RELATION_DENY_PREFIX.length;
45
+ const DENY_PHASES = ['read', 'write'];
23
46
  const OBJECT_TYPE_MAX = 254;
24
47
  /** Nombres FGA: minúsculas, dígitos y `._-`; sin `:`/`#`/`@`/espacios ni `|`. */
25
48
  const FGA_NAME_FORMAT = /^[a-z0-9][a-z0-9._-]*$/;
49
+ /**
50
+ * **Listas blancas por nivel de la spec** (plan 2.5 · lote B · B2; linaje L5,
51
+ * propiedad universal «ninguna clave de una spec de config se descarta»).
52
+ * Una clave que no está en la lista de SU nivel es 422
53
+ * `E_AUTHZ_RELATION_CONFIG_UNKNOWN_KEY` nombrando la ruta (`objectTypes[1].deny`)
54
+ * y la lista. Hasta `2.5.0-alpha.1` la config congelada copiaba solo lo que
55
+ * conocía y tiraba el resto en silencio (tester H3, medido: `deny: true` y
56
+ * `denny: 1` desaparecían): un typo era una entrada inerte, y el lote D (deny)
57
+ * habría nacido con la clave `deny` leída por un proceso viejo como «nada».
58
+ * Las claves del lote D entran AQUÍ, en el mismo commit que su efecto.
59
+ */
60
+ export const RELATIONS_SPEC_KEYS = Object.freeze({
61
+ root: Object.freeze(['objectTypes', 'holderTypes', 'database']),
62
+ objectType: Object.freeze(['type', 'relations', 'deny']),
63
+ relation: Object.freeze(['name', 'includes']),
64
+ database: Object.freeze(['membersOf']),
65
+ });
66
+ const _exhaustiveRelationsRoot = {};
67
+ const _exhaustiveRelationsObjectType = {};
68
+ const _exhaustiveRelationsRelation = {};
69
+ const _exhaustiveRelationsDatabase = {};
70
+ void _exhaustiveRelationsRoot, _exhaustiveRelationsObjectType, _exhaustiveRelationsRelation, _exhaustiveRelationsDatabase;
71
+ RELATIONS_SPEC_KEYS.root;
72
+ RELATIONS_SPEC_KEYS.objectType;
73
+ RELATIONS_SPEC_KEYS.relation;
74
+ RELATIONS_SPEC_KEYS.database;
75
+ /** ⚪ 13: una clave de BLOQUE conocida con un valor que no es un objeto plano (`database: true`) es 422, no silencio. */
76
+ function assertObjectBlock(value, path) {
77
+ if (value === undefined)
78
+ return;
79
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
80
+ throw new RelationConfigError(`Config de relaciones inválida: '${path}' tiene que ser un objeto (llegó ${JSON.stringify(value)}). ` +
81
+ `Un valor que no es objeto en una clave conocida no es «nada»: se ignoraría en silencio.`);
82
+ }
83
+ }
84
+ /** Toda clave PROPIA de `value` tiene que estar en `known`; si no, 422 con la ruta y la lista blanca del nivel. */
85
+ function assertKnownKeys(value, known, path) {
86
+ if (!value || typeof value !== 'object' || Array.isArray(value))
87
+ return;
88
+ for (const key of Object.keys(value)) {
89
+ if (known.includes(key))
90
+ continue;
91
+ const where = path === '' ? `'${key}' en la raíz de la spec` : `'${path}.${key}'`;
92
+ throw new RelationConfigUnknownKeyError(`Config de relaciones inválida: la clave ${where} no existe (claves válidas en ${path === '' ? 'la raíz' : path}: ${known.join(', ')}). ` +
93
+ `Ninguna clave de la spec se descarta en silencio: un typo ('denny') o una clave de otra versión del paquete ` +
94
+ `sería una entrada inerte que el modelo publicado no refleja. Quítala o corrige el nombre.`);
95
+ }
96
+ }
97
+ /**
98
+ * **B1 · ciclos de `includes`** (plan 2.5 · lote B; analista M3 / tester H4,
99
+ * medidos): `editor ⊇ viewer ⊇ editor` se aceptaba — `database` lo SIRVE (la
100
+ * expansión termina por el `Set`) y OpenFGA rechaza CUALQUIER ciclo al
101
+ * publicar el modelo, así que la paridad estaba rota desde el config. Es
102
+ * config, no driver: el mismo 422 vale para los dos ANTES de construir nada.
103
+ * DFS con pila de colores sobre el grafo `relation → includes` del tipo;
104
+ * devuelve el ciclo NOMBRADO (`a → b → a`, desde el nodo que lo cierra, no
105
+ * desde la raíz por la que se entró) o `null`. Un ciclo directo (`a ⊇ a`) es
106
+ * el caso de longitud 1 del mismo recorrido.
107
+ */
108
+ function findIncludesCycle(relations) {
109
+ const edges = new Map();
110
+ for (const relation of relations)
111
+ edges.set(relation.name, relation.includes ?? []);
112
+ const state = new Map();
113
+ const stack = [];
114
+ const visit = (name) => {
115
+ const mark = state.get(name);
116
+ if (mark === 'done')
117
+ return null;
118
+ if (mark === 'visiting') {
119
+ const start = stack.indexOf(name);
120
+ return [...stack.slice(start), name];
121
+ }
122
+ state.set(name, 'visiting');
123
+ stack.push(name);
124
+ for (const next of edges.get(name) ?? []) {
125
+ const cycle = visit(next);
126
+ if (cycle)
127
+ return cycle;
128
+ }
129
+ stack.pop();
130
+ state.set(name, 'done');
131
+ return null;
132
+ };
133
+ for (const relation of relations) {
134
+ const cycle = visit(relation.name);
135
+ if (cycle)
136
+ return cycle;
137
+ }
138
+ return null;
139
+ }
26
140
  function reject(message) {
27
141
  throw new RelationConfigError(message);
28
142
  }
@@ -93,6 +207,64 @@ export function assertObjectTypeDeclared(config, object) {
93
207
  `'role_binding' real y escalar a roles.authorize, purgarlo o enumerar sus asignados.`);
94
208
  }
95
209
  }
210
+ /**
211
+ * **B3 · el userset del SUJETO: F-05 (par) y, además, `group#member` y solo
212
+ * `group#member`** (plan 2.5 · lote B; auditor [N 9] de la ronda 1, analista
213
+ * B(2); patrón F-05 `assertRelationDeclared`: UNA función, misma clase, mismo
214
+ * `code` y mismo mensaje por cualquier puerta). Hasta `2.5.0-alpha.1` un
215
+ * `{ object: document, relation: viewer }` como sujeto pasaba F-05 (tipo y
216
+ * relación declarados) y después: `database` guardaba la fila INERTE (ningún
217
+ * holder la alcanza: la expansión de principales solo baja por `group#member`)
218
+ * y `openfga` componía `document:<key>|<id>#viewer` como `user`, que el modelo
219
+ * fusionado no admite ⇒ 400 del servidor ⇒ 503 mal clasificado (invariante 5:
220
+ * una pregunta inválida es 422, no una caída). La aplican el `RelationsManager`
221
+ * (`#assertSubject`), los DOS drivers (`#subjectColumns` / `#subjectUser`) y el
222
+ * doble publicado, en TODA operación que recibe sujeto —`relate`/`unrelate`/
223
+ * `check`/`checkMany`/`listObjects`/`purgeSubject`—, ANTES de tocar el backend
224
+ * (cero `INSERT`, cero `Write`/`Read`/`Check`). La guardia de superficie lo
225
+ * sondea como variante de F-05 (`usersetUnsupported`) con un mutante por capa.
226
+ */
227
+ export function assertUsersetSubject(config, subject) {
228
+ assertRelationDeclared(config, subject.object, subject.relation);
229
+ assertSupportedUserset(subject);
230
+ }
231
+ /**
232
+ * **La mitad de B3 que no necesita config**: `group#member` y solo `group#member`
233
+ * (cierre 1 del lote B · 🟠 2). Es la regla que `reconcileRelations` aplica en el
234
+ * PLAN a cada tupla ENUMERADA —del origen y del destino— también cuando no hay
235
+ * `toConfig` (sin config no se puede juzgar F-05 del par, pero la forma del
236
+ * userset sí): así un residuo pre-2.5 se clasifica ANTES del driver, con los
237
+ * mismos números en `--dry-run` y en la pasada real. **En el plan la FORMA va
238
+ * ANTES que F-05** (cierre 2 · 🟡 N2): un residuo B3 es inadmisible con
239
+ * cualquier config, así que un userset de tipo/relación no declarados sigue
240
+ * siendo residuo (`usersetUnsupported`, con receta) y nunca `undeclared` (cuyo
241
+ * consejo «decláralo» no lo arreglaría). En la API (`assertUsersetSubject`,
242
+ * la pregunta del llamante) el orden sigue siendo F-05 → forma: los dos son
243
+ * 422 y ninguno escribe.
244
+ */
245
+ export function assertSupportedUserset(subject) {
246
+ if (subject.object.type !== RELATION_USERSET_TYPE || subject.relation !== RELATION_USERSET_RELATION) {
247
+ throw new RelationUsersetUnsupportedError(`El userset '${subject.object.type}#${subject.relation}' no vale como SUJETO de una relación (B3): el modelo ` +
248
+ `solo admite '${RELATION_USERSET_TYPE}#${RELATION_USERSET_RELATION}' como sujeto de una relación de dominio. ` +
249
+ `En 'database' esa fila sería inerte (ningún holder la alcanza) y en 'openfga' un 400 del servidor; ` +
250
+ `relaciona al holder o al grupo, no a la relación de otro objeto.`);
251
+ }
252
+ }
253
+ /**
254
+ * **El residuo pre-2.5 de B3 y cómo se borra** (cierre 1 del lote B · 🟠 1/🟠 2,
255
+ * ⚪ 12): una fila de `authz_relations` escrita ANTES de 2.5.0 con un sujeto
256
+ * userset ≠ `group#member`. La API ya no la admite (ni `relate`, ni `unrelate`,
257
+ * ni `purgeSubject(userset)`), el reconcile la LISTA con este motivo y **nunca
258
+ * la borra por vía de plataforma** (decisión del coordinador, 2026-10-15: la
259
+ * misma regla que toda tupla del destino fuera de gramática — se lista, exit
260
+ * ≠ 0, se borra a mano). Las dos sentencias valen en los tres motores
261
+ * (`subject_relation <> ''` excluye los holders, también los `NULL` de antes
262
+ * de L-4b: `NULL <> ''` es NULL ⇒ falso); `upgrade_recipe.spec` las EJECUTA y
263
+ * el README §Upgrading las publica literalmente.
264
+ */
265
+ export const RELATION_USERSET_RESIDUE_WHERE = `subject_relation <> '' AND NOT (subject_type = '${RELATION_USERSET_TYPE}' AND subject_relation = '${RELATION_USERSET_RELATION}')`;
266
+ export const RELATION_USERSET_RESIDUE_SELECT = `SELECT uuid, partition_key, object_type, object_uuid, relation, subject_type, subject_uuid, subject_relation FROM authz_relations WHERE ${RELATION_USERSET_RESIDUE_WHERE};`;
267
+ export const RELATION_USERSET_RESIDUE_DELETE = `DELETE FROM authz_relations WHERE ${RELATION_USERSET_RESIDUE_WHERE};`;
96
268
  /**
97
269
  * Valida y congela la config de relaciones. Config inválida ⇒ 422
98
270
  * `E_AUTHZ_RELATION_CONFIG` (misma clase que el gate del modelo del lote 4-1).
@@ -101,6 +273,15 @@ export function defineRelationsConfig(spec) {
101
273
  if (!spec || typeof spec !== 'object') {
102
274
  reject(`Config de relaciones inválida: se esperaba un objeto y llegó ${JSON.stringify(spec)}.`);
103
275
  }
276
+ // ⚪ 13 (cierre 1 del lote B): una config YA DEFINIDA (la salida de esta misma
277
+ // función: `isDeclared`/`hasType` son funciones) pasada como spec —el tipo
278
+ // estructural lo permite, p. ej. `saveRelationsConfig(config.relations.config)`—
279
+ // moría en «'membersOf' en la raíz no existe» sin pista. Se dice lo que es.
280
+ if (typeof spec.isDeclared === 'function' && typeof spec.hasType === 'function') {
281
+ reject(`Config de relaciones inválida: parece una config YA DEFINIDA (la salida de defineRelationsConfig: lleva ` +
282
+ `isDeclared/hasType), no la spec. Pasa la spec declarativa ({ objectTypes, holderTypes?, database? }) — ` +
283
+ `también a saveRelationsConfig, que persiste la spec, no la config congelada.`);
284
+ }
104
285
  // `membersOf` SOLO puede vivir en las opciones de `database` (⚪ del tester):
105
286
  // ponerlo en la raíz o en un futuro bloque `openfga` es un error de
106
287
  // configuración —`openfga` no puede resolver la transitiva sin truncar—.
@@ -109,9 +290,22 @@ export function defineRelationsConfig(spec) {
109
290
  `(membresía transitiva por CTE recursiva) y va en 'database.membersOf', no en la raíz. ` +
110
291
  `En 'openfga' la transitiva sería 'ListUsers', que trunca al tope del servidor.`);
111
292
  }
293
+ // B2: la raíz, ANTES de leer nada de ella (un `deny: true` aquí no es «nada»).
294
+ assertKnownKeys(spec, RELATIONS_SPEC_KEYS.root, '');
295
+ // ⚪ 13 (cierre 1 del lote B; L5): un valor que NO es objeto en una clave
296
+ // conocida de bloque (`database: true`) se ignoraba en silencio —`assertKnownKeys`
297
+ // sale si no es objeto y `spec.database?.membersOf` daba `undefined`—. Es 422.
298
+ assertObjectBlock(spec.database, 'database');
299
+ assertKnownKeys(spec.database, RELATIONS_SPEC_KEYS.database, 'database');
112
300
  if (!Array.isArray(spec.objectTypes) || spec.objectTypes.length === 0) {
113
301
  reject(`Config de relaciones inválida: 'objectTypes' tiene que ser un array no vacío.`);
114
302
  }
303
+ // ⚪ N7 (cierre 2 del lote B): una cadena se ITERABA por caracteres y
304
+ // desactivaba la colisión ⚪4 (`holderTypes: 'user'` + `{ type: 'user' }`
305
+ // entraba). L5: ningún valor con forma equivocada cae en un default.
306
+ if (spec.holderTypes !== undefined && !Array.isArray(spec.holderTypes)) {
307
+ reject(`Config de relaciones inválida: 'holderTypes' tiene que ser un array de cadenas (llegó ${JSON.stringify(spec.holderTypes)}).`);
308
+ }
115
309
  const holderTypes = spec.holderTypes ?? [];
116
310
  for (const holder of holderTypes) {
117
311
  if (typeof holder !== 'string') {
@@ -120,7 +314,8 @@ export function defineRelationsConfig(spec) {
120
314
  }
121
315
  const reservedTypes = new Set([...RESERVED_FACTS_TYPES, ...holderTypes]);
122
316
  const seenTypes = new Set();
123
- for (const objectType of spec.objectTypes) {
317
+ for (const [typeIndex, objectType] of spec.objectTypes.entries()) {
318
+ assertKnownKeys(objectType, RELATIONS_SPEC_KEYS.objectType, `objectTypes[${typeIndex}]`);
124
319
  const type = objectType?.type;
125
320
  if (typeof type !== 'string' || !FGA_NAME_FORMAT.test(type) || type.length > OBJECT_TYPE_MAX) {
126
321
  reject(`Config de relaciones inválida: tipo de objeto ${JSON.stringify(type)} no es un tipo FGA válido ` +
@@ -142,7 +337,8 @@ export function defineRelationsConfig(spec) {
142
337
  reject(`Config de relaciones inválida: el tipo '${type}' no declara ninguna relación.`);
143
338
  }
144
339
  const own = new Set();
145
- for (const relation of objectType.relations) {
340
+ for (const [relationIndex, relation] of objectType.relations.entries()) {
341
+ assertKnownKeys(relation, RELATIONS_SPEC_KEYS.relation, `objectTypes[${typeIndex}].relations[${relationIndex}]`);
146
342
  const name = relation?.name;
147
343
  if (typeof name !== 'string' || !FGA_NAME_FORMAT.test(name)) {
148
344
  reject(`Config de relaciones inválida: relación ${JSON.stringify(name)} del tipo '${type}' no es un ` +
@@ -169,6 +365,12 @@ export function defineRelationsConfig(spec) {
169
365
  }
170
366
  // Los `includes` refieren relaciones del MISMO tipo (un nivel, SIN `from`).
171
367
  for (const relation of objectType.relations) {
368
+ // ⚪ 13 (cierre 1 del lote B): `includes: {}` (o cualquier no-array) era un
369
+ // `TypeError` crudo del `for…of`; es una config inválida, 422 con la ruta.
370
+ if (relation.includes !== undefined && !Array.isArray(relation.includes)) {
371
+ reject(`Config de relaciones inválida: 'includes' de '${type}#${relation.name}' tiene que ser un array de nombres ` +
372
+ `de relación (llegó ${JSON.stringify(relation.includes)}).`);
373
+ }
172
374
  for (const included of relation.includes ?? []) {
173
375
  if (typeof included !== 'string') {
174
376
  reject(`Config de relaciones inválida: un 'includes' de '${type}#${relation.name}' no es una cadena.`);
@@ -182,11 +384,33 @@ export function defineRelationsConfig(spec) {
182
384
  reject(`Config de relaciones inválida: '${type}#${relation.name}' incluye '${included}', que no es una ` +
183
385
  `relación de '${type}'. Los includes son de un nivel y del mismo tipo (v1 no soporta 'from').`);
184
386
  }
185
- if (included === relation.name) {
186
- reject(`Config de relaciones inválida: '${type}#${relation.name}' se incluye a sí misma.`);
387
+ }
388
+ }
389
+ // D1 · D10: el opt-in del deny, sus dos fases y la cota de 43 (D-18).
390
+ if (objectType.deny !== undefined) {
391
+ if (!DENY_PHASES.includes(objectType.deny)) {
392
+ reject(`Config de relaciones inválida: 'objectTypes[${typeIndex}].deny' de '${type}' es ${JSON.stringify(objectType.deny)}; ` +
393
+ `los valores son 'read' (fase 1: el modelo declara denied_<rel> y las lecturas lo honran; deny() sigue siendo 422) ` +
394
+ `y 'write' (fase 2: además se aceptan escrituras). No hay 'true': un interruptor único no tiene secuencia de ` +
395
+ `despliegue segura (un pod con el modelo viejo ignora el deny que otro escribe) — publica 'read', despliega la ` +
396
+ `flota entera con el modelId nuevo y solo entonces, en otro despliegue, 'write'.`);
397
+ }
398
+ for (const relation of objectType.relations) {
399
+ if (relation.name.length > DENIABLE_RELATION_NAME_MAX) {
400
+ reject(`Config de relaciones inválida: la relación '${type}#${relation.name}' tiene ${relation.name.length} caracteres y el ` +
401
+ `tipo declara deny: su relación almacenada '${RELATION_DENY_PREFIX}${relation.name}' no cabe en los ` +
402
+ `${RELATION_NAME_MAX} de FGA. Una relación de un tipo denegable mide como mucho ${DENIABLE_RELATION_NAME_MAX}.`);
187
403
  }
188
404
  }
189
405
  }
406
+ // B1: ningún ciclo en el grafo de includes del tipo (directo, de 2, de N).
407
+ const cycle = findIncludesCycle(objectType.relations);
408
+ if (cycle) {
409
+ reject(`Config de relaciones inválida: los 'includes' del tipo '${type}' forman un ciclo ` +
410
+ `(${cycle.map((name) => `${type}#${name}`).join(' → ')}). OpenFGA rechaza cualquier ciclo al publicar el ` +
411
+ `modelo y 'database' lo serviría igual: sería una config que un driver acepta y el otro no (paridad rota). ` +
412
+ `Los includes son un orden parcial: quita la arista que lo cierra.`);
413
+ }
190
414
  }
191
415
  const declared = new Map();
192
416
  // `group` es el tipo BUILT-IN de las relaciones (el portador de los
@@ -195,11 +419,17 @@ export function defineRelationsConfig(spec) {
195
419
  // pero SÍ es un tipo válido para F-05: `relate(group:g#member, viewer, doc)`
196
420
  // y `relate(u, member, group:g)` son legales. `role_binding`/`scope`/`role`
197
421
  // siguen fuera: la frontera del 🔴 se mantiene.
198
- declared.set('group', new Set(['member']));
422
+ declared.set(RELATION_USERSET_TYPE, new Set([RELATION_USERSET_RELATION]));
423
+ // Desde B2 la copia congelada no «tira» nada: toda clave que llega hasta aquí
424
+ // está en la lista blanca de su nivel (lo demás ya fue 422 arriba).
199
425
  const frozenTypes = spec.objectTypes.map((objectType) => {
200
426
  const relations = objectType.relations.map((relation) => Object.freeze({ name: relation.name, includes: relation.includes ? Object.freeze([...relation.includes]) : undefined }));
201
427
  declared.set(objectType.type, new Set(relations.map((r) => r.name)));
202
- return Object.freeze({ type: objectType.type, relations: Object.freeze(relations) });
428
+ // D-29: un tipo SIN deny se congela con EXACTAMENTE las dos claves de 2.4.0-alpha.10 (el generador del modelo lo
429
+ // emite byte a byte igual); `deny` solo aparece cuando se declaró.
430
+ return objectType.deny === undefined
431
+ ? Object.freeze({ type: objectType.type, relations: Object.freeze(relations) })
432
+ : Object.freeze({ type: objectType.type, relations: Object.freeze(relations), deny: objectType.deny });
203
433
  });
204
434
  return Object.freeze({
205
435
  objectTypes: Object.freeze(frozenTypes),
@@ -208,4 +438,162 @@ export function defineRelationsConfig(spec) {
208
438
  isDeclared: (objectType, relation) => declared.get(objectType)?.has(relation) ?? false,
209
439
  });
210
440
  }
441
+ /* ── Deny (plan 2.5 · lote D · D1): la fase del opt-in y los cierres del grafo de `includes` ─────────────────── */
442
+ /** La fase del opt-in del deny de un tipo (`undefined` = sin opt-in; `group` nunca). */
443
+ export function denyPhaseOf(config, objectType) {
444
+ return config.objectTypes.find((t) => t.type === objectType)?.deny;
445
+ }
446
+ /** ¿Algún tipo de la config declara el opt-in (en cualquier fase)? Decide D14 (`modelId` fijado obligatorio en `openfga`). */
447
+ export function hasDenyTypes(config) {
448
+ return config.objectTypes.some((t) => t.deny !== undefined);
449
+ }
450
+ /** La relación ALMACENADA del deny de `relation` (`viewer` ⇒ `denied_viewer`). */
451
+ export function deniedRelationOf(relation) {
452
+ return `${RELATION_DENY_PREFIX}${relation}`;
453
+ }
454
+ /**
455
+ * **La consulta del README §Upgrading que cuenta los denies VIVOS de relaciones** (plan 2.5 · lote D · D2; D12/S17: no
456
+ * hay rollback por debajo de 2.5 con denies vivos — antes de volver atrás tiene que dar 0). Portable a los tres motores
457
+ * (`substr` existe en SQLite, PostgreSQL y MySQL; `LIKE 'denied\_%'` no: SQLite no tiene escape por defecto). La ejecutan
458
+ * `tests/upgrade_recipe.spec.ts` (los cuatro modos, contra el README byte a byte) y el paso 21 del runbook.
459
+ */
460
+ export const RELATION_DENIES_COUNT_SQL = "SELECT count(*) AS n FROM authz_relations WHERE substr(relation, 1, 7) = 'denied_';";
461
+ /**
462
+ * **La relación ALMACENADA, leída de vuelta: nombre público + `kind`** (plan 2.5 · lote D · D2; el reconcile con
463
+ * `kind`). Es el PUNTO DE PASO ÚNICO de `enumerateRelations(Many)` en los dos drivers y en el doble: `denied_viewer`
464
+ * ⇒ `{ relation: 'viewer', kind: 'deny' }`; cualquier otra ⇒ `{ relation, kind: 'allow' }`. Inequívoco porque el
465
+ * prefijo está en `RESERVED_SLUG_PREFIXES` (ninguna relación de dominio puede empezar por `denied_`). Hasta D2 los
466
+ * drivers emitían `relation: 'denied_viewer'` sin `kind`, y `reconcileRelations` lo contaba como relación NO
467
+ * declarada (`skipped.undeclared`): una migración `database → openfga` no llevaba los denies.
468
+ */
469
+ export function storedRelationKind(stored) {
470
+ return typeof stored === 'string' && stored.startsWith(RELATION_DENY_PREFIX) && stored.length > RELATION_DENY_PREFIX.length
471
+ ? { relation: stored.slice(RELATION_DENY_PREFIX.length), kind: 'deny' }
472
+ : { relation: stored, kind: 'allow' };
473
+ }
474
+ /**
475
+ * **`down*(R)`: las relaciones cuyo hecho DIRECTO satisface `R`** (R y todo lo que incluye, transitivamente). Es el
476
+ * PUNTO DE PASO ÚNICO del grafo de `includes` hacia abajo (lote D: antes lo reimplementaban `#expandDown` del driver
477
+ * `database` y el doble; con el deny hacen falta las dos direcciones en tres sitios y, calculadas tres veces,
478
+ * divergen). En el retículo del contrato: `down*(viewer) = {viewer, editor, owner}`.
479
+ */
480
+ export function relationsDown(config, objectType, relation) {
481
+ const out = new Set([relation]);
482
+ const type = config.objectTypes.find((t) => t.type === objectType);
483
+ const queue = [relation];
484
+ while (queue.length) {
485
+ const current = queue.pop();
486
+ const def = type?.relations.find((r) => r.name === current);
487
+ for (const inc of def?.includes ?? []) {
488
+ if (!out.has(inc)) {
489
+ out.add(inc);
490
+ queue.push(inc);
491
+ }
492
+ }
493
+ }
494
+ return [...out];
495
+ }
496
+ /**
497
+ * **`up*(R)`: las relaciones que INCLUYEN a `R`** (R y todo lo que la incluye, transitivamente). Un deny en cualquiera
498
+ * de ellas CORTA un grant de `R` (D5, corte de camino): `up*(owner) = {owner, editor, viewer}` ⇒ un deny en `editor`
499
+ * anula entero un grant de `owner`.
500
+ */
501
+ export function relationsUp(config, objectType, relation) {
502
+ const out = new Set([relation]);
503
+ const type = config.objectTypes.find((t) => t.type === objectType);
504
+ const queue = [relation];
505
+ while (queue.length) {
506
+ const current = queue.pop();
507
+ for (const candidate of type?.relations ?? []) {
508
+ if ((candidate.includes ?? []).includes(current) && !out.has(candidate.name)) {
509
+ out.add(candidate.name);
510
+ queue.push(candidate.name);
511
+ }
512
+ }
513
+ }
514
+ return [...out];
515
+ }
516
+ /**
517
+ * **D5 · CORTE DE CAMINO, la regla ÚNICA** (decisión del dueño 2026-10-14; tester §2.1, la tabla T1 de 64 estados):
518
+ * `check(s, Q, o) = T` sii existe un grant `T ∈ A ∩ down*(Q)` tal que `up*(T) ∩ D = ∅`, con `A` = las relaciones con
519
+ * allow vivo que alcanzan al sujeto (directo o por `group#member`, anidado) y `D` = las relaciones con deny que lo
520
+ * alcanzan igual. Es EXACTAMENTE lo que el modelo FGA evalúa en el servidor (`X = (this ∨ I…) but not denied_X`,
521
+ * `denied_X = this ∨ denied_P` por cada `P ⊇ X`), y es la función que usan el driver `database`, el doble y el
522
+ * oráculo de la suite: tres copias divergirían (L8).
523
+ */
524
+ export function cutPathAllows(config, objectType, relation, allowed, denied) {
525
+ for (const granted of relationsDown(config, objectType, relation)) {
526
+ if (!allowed.has(granted))
527
+ continue;
528
+ if (relationsUp(config, objectType, granted).every((above) => !denied.has(above)))
529
+ return true;
530
+ }
531
+ return false;
532
+ }
533
+ /** Las relaciones del deny que `decideMany`/`check` tienen que leer para `R`: `up*(down*(R))` (D9, definición AMPLIA). */
534
+ export function deniableAbove(config, objectType, relation) {
535
+ const out = new Set();
536
+ for (const granted of relationsDown(config, objectType, relation)) {
537
+ for (const above of relationsUp(config, objectType, granted))
538
+ out.add(above);
539
+ }
540
+ return [...out];
541
+ }
542
+ /**
543
+ * **D9 · `decideMany` AMPLIO, la regla ÚNICA** (decisión del dueño 2026-10-14; juez ronda 2 §4): `allow` si `check`
544
+ * concede (el deny ya está aplicado dentro del objeto por corte de camino); si no, `deny` si el sujeto tiene un deny
545
+ * vivo sobre ALGUNA relación de `up*(down*(R))` en el objeto; si no, `none`. Más amplia que `check` a propósito
546
+ * (fail-closed en la cadena del llamante): un `viewer` heredado con un deny(`editor`) en el hijo da `deny`.
547
+ */
548
+ export function decideFrom(config, objectType, relation, allowed, denied) {
549
+ if (cutPathAllows(config, objectType, relation, allowed, denied))
550
+ return 'allow';
551
+ return deniableAbove(config, objectType, relation).some((r) => denied.has(r)) ? 'deny' : 'none';
552
+ }
553
+ /**
554
+ * **La puerta de ESCRITURA del deny** (D10/D-17): `deny()` solo entra sobre un tipo en fase `'write'`; sin opt-in, en
555
+ * `'read'` o sobre `group` ⇒ 422 `E_AUTHZ_RELATION_NOT_DENYABLE`. La aplican el manager, los dos drivers y el doble,
556
+ * DESPUÉS de F-05 (un tipo no declarado sigue siendo `E_AUTHZ_RELATION_TYPE_UNKNOWN`). `removeDeny`/`listDenies` NO
557
+ * pasan por aquí: aceptan cualquier tipo declarado (D8/R2-4 b: retirar el opt-in tiene que ser reversible).
558
+ */
559
+ export function assertRelationDenyable(config, object, relation) {
560
+ const phase = denyPhaseOf(config, object.type);
561
+ if (phase === 'write')
562
+ return;
563
+ const why = object.type === RELATION_USERSET_TYPE
564
+ ? `'${RELATION_USERSET_TYPE}' es el tipo built-in de los usersets: un deny sobre la pertenencia a un grupo no existe (para ` +
565
+ `sacar a alguien de un grupo, unrelate(u, member, group:g))`
566
+ : phase === 'read'
567
+ ? `el tipo '${object.type}' está en la FASE 1 del opt-in (deny: 'read'): el modelo y las lecturas ya honran el deny, ` +
568
+ `pero las escrituras no se aceptan hasta que TODA la flota sirva el modelo nuevo; pásalo a deny: 'write' en un ` +
569
+ `segundo despliegue`
570
+ : `el tipo '${object.type}' no declara deny en defineRelationsConfig (opt-in por tipo, en dos fases: 'read' y luego 'write')`;
571
+ throw new RelationNotDenyableError(`deny(…, '${relation}', ${object.type}): no se puede denegar — ${why}. No se ha escrito nada.`);
572
+ }
573
+ /**
574
+ * **El comodín `*` no es un sujeto de deny** (D-17): un deny a «todos» sería un apagado del objeto que nadie
575
+ * auditaría como tal. Hoy la gramática de holder ya rechaza `*` (422 `E_AUTHZ_INVALID_IDENTITY`); esta guarda lo dice
576
+ * con el código del deny ANTES de la gramática, para que un cambio de la gramática no lo abra en silencio.
577
+ */
578
+ export function assertDenySubject(subject) {
579
+ if (subject && typeof subject === 'object' && subject.uuid === '*') {
580
+ throw new RelationNotDenyableError(`deny: el comodín '*' no es un sujeto de deny (un deny a «todos» apagaría el objeto sin que ningún grant lo explique). ` +
581
+ `Deniega a un holder o a un group#member. No se ha escrito nada.`);
582
+ }
583
+ }
584
+ /**
585
+ * **D3: el deny no caduca en v1.** `expiresAt` en las opciones de `deny`/`removeDeny` —incluso `null`, que en `relate`
586
+ * significa «quitar la caducidad»— es 422 `E_AUTHZ_DENY_EXPIRY_UNSUPPORTED` ANTES de tocar el backend, con la razón
587
+ * medida (M5). La clave PRESENTE es lo que se rechaza: un `null` aceptado sería una puerta para que la siguiente
588
+ * versión la lea como «permanente» sin que nadie lo decidiera.
589
+ */
590
+ export function assertDenyNoExpiry(options) {
591
+ if (options && typeof options === 'object' && 'expiresAt' in options) {
592
+ throw new RelationDenyExpiryError(`deny/removeDeny: 'expiresAt' no se admite — el deny de relaciones NO caduca en v1 (D3). Medido en OpenFGA v1.19.0 ` +
593
+ `(M5): FGA rechaza delete+write de la misma clave en un Write (400 cannot_allow_duplicate_tuples_in_one_request) y ` +
594
+ `on_duplicate: ignore con otra condición es 409, así que cambiar la caducidad de un deny VIVO abre una ventana en la ` +
595
+ `que deja de bloquear (y si el segundo Write cae, el deny desaparece). Quita la clave; para un acceso temporal, ` +
596
+ `caduca el GRANT (relate con expiresAt), no el deny. No se ha escrito nada.`);
597
+ }
598
+ }
211
599
  //# sourceMappingURL=define_relations_config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"define_relations_config.js","sourceRoot":"","sources":["../../../src/relations/define_relations_config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"define_relations_config.js","sourceRoot":"","sources":["../../../src/relations/define_relations_config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EACL,mBAAmB,EACnB,6BAA6B,EAC7B,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAG7F;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,OAAO,CAAA;AAC5C,MAAM,CAAC,MAAM,yBAAyB,GAAG,QAAQ,CAAA;AAEjD,yFAAyF;AACzF,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAE5B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAA;AAE7C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,iBAAiB,GAAG,oBAAoB,CAAC,MAAM,CAAA;AAiBzF,MAAM,WAAW,GAAiC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AACnE,MAAM,eAAe,GAAG,GAAG,CAAA;AAC3B,iFAAiF;AACjF,MAAM,eAAe,GAAG,wBAAwB,CAAA;AAEhD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/C,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,aAAa,EAAE,UAAU,CAAU,CAAC;IACxE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAU,CAAC;IACjE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,UAAU,CAAU,CAAC;IACtD,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAAU,CAAC;CAChD,CAAC,CAAA;AAeF,MAAM,wBAAwB,GAAiF,EAAE,CAAA;AACjH,MAAM,8BAA8B,GAA0F,EAAE,CAAA;AAChI,MAAM,4BAA4B,GAA4F,EAAE,CAAA;AAChI,MAAM,4BAA4B,GAA0F,EAAE,CAAA;AAC9H,KAAK,wBAAwB,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,4BAA4B,CAAA;AACzH,mBAAmB,CAAC,IAAqD,CAAA;AACzE,mBAAmB,CAAC,UAA8D,CAAA;AAClF,mBAAmB,CAAC,QAAgE,CAAA;AACpF,mBAAmB,CAAC,QAA8D,CAAA;AAElF,wHAAwH;AACxH,SAAS,iBAAiB,CAAC,KAAc,EAAE,IAAY;IACrD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAM;IAC/B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,mBAAmB,CAC3B,mCAAmC,IAAI,oCAAoC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK;YACnG,yFAAyF,CAC5F,CAAA;IACH,CAAC;AACH,CAAC;AAED,mHAAmH;AACnH,SAAS,eAAe,CAAC,KAAc,EAAE,KAAwB,EAAE,IAAY;IAC7E,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAM;IACvE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,EAAE,CAAC;QAChE,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAQ;QACjC,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,yBAAyB,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,GAAG,GAAG,CAAA;QACjF,MAAM,IAAI,6BAA6B,CACrC,2CAA2C,KAAK,iCAAiC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;YACvI,8GAA8G;YAC9G,2FAA2F,CAC9F,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,iBAAiB,CAAC,SAAgD;IACzE,MAAM,KAAK,GAAG,IAAI,GAAG,EAA6B,CAAA;IAClD,KAAK,MAAM,QAAQ,IAAI,SAAS;QAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAA;IACnF,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAA;IACpD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAmB,EAAE;QAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAA;QAChC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACjC,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;QACtC,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;YACzB,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAA;QACzB,CAAC;QACD,KAAK,CAAC,GAAG,EAAE,CAAA;QACX,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACvB,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IACD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAClC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAA;IACzB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAiED,SAAS,MAAM,CAAC,OAAe;IAC7B,MAAM,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAA;AACxC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAuB,EACvB,MAAoC,EACpC,QAAgB;IAEhB,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,oBAAoB,CAC5B,mBAAmB,MAAM,CAAC,IAAI,4BAA4B,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG;YAC1H,kGAAkG;YAClG,+DAA+D,CAClE,CAAA;IACH,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,oBAAoB,CAC5B,gBAAgB,MAAM,CAAC,QAAQ,CAAC,qCAAqC,MAAM,CAAC,IAAI,OAAO;YACrF,+BAA+B,CAClC,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAuB,EAAE,MAAoC;IACpG,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7E,MAAM,IAAI,wBAAwB,CAChC,iEAAiE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAC3F,CAAA;IACH,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,wBAAwB,CAChC,sBAAsB,MAAM,CAAC,IAAI,uDAAuD;YACtF,iGAAiG;YACjG,4FAA4F;YAC5F,qFAAqF,CACxF,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAuB,EAAE,OAAmB;IAC/E,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAChE,sBAAsB,CAAC,OAAO,CAAC,CAAA;AACjC,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAmB;IACxD,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,qBAAqB,IAAI,OAAO,CAAC,QAAQ,KAAK,yBAAyB,EAAE,CAAC;QACpG,MAAM,IAAI,+BAA+B,CACvC,eAAe,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,wDAAwD;YAC5G,gBAAgB,qBAAqB,IAAI,yBAAyB,4CAA4C;YAC9G,qGAAqG;YACrG,kEAAkE,CACrE,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,8BAA8B,GACzC,mDAAmD,qBAAqB,6BAA6B,yBAAyB,IAAI,CAAA;AACpI,MAAM,CAAC,MAAM,+BAA+B,GAC1C,2IAA2I,8BAA8B,GAAG,CAAA;AAC9K,MAAM,CAAC,MAAM,+BAA+B,GAAG,qCAAqC,8BAA8B,GAAG,CAAA;AAErH;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAyB;IAC7D,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,CAAC,gEAAgE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACjG,CAAC;IACD,8EAA8E;IAC9E,2EAA2E;IAC3E,iFAAiF;IACjF,4EAA4E;IAC5E,IAAI,OAAQ,IAAY,CAAC,UAAU,KAAK,UAAU,IAAI,OAAQ,IAAY,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAClG,MAAM,CACJ,0GAA0G;YACxG,yGAAyG;YACzG,8EAA8E,CACjF,CAAA;IACH,CAAC;IACD,6EAA6E;IAC7E,oEAAoE;IACpE,yEAAyE;IACzE,IAAI,WAAW,IAAK,IAA2C,EAAE,CAAC;QAChE,MAAM,CACJ,iFAAiF;YAC/E,wFAAwF;YACxF,gFAAgF,CACnF,CAAA;IACH,CAAC;IAED,+EAA+E;IAC/E,eAAe,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACnD,yEAAyE;IACzE,mFAAmF;IACnF,+EAA+E;IAC/E,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IAC5C,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IAExE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,MAAM,CAAC,+EAA+E,CAAC,CAAA;IACzF,CAAC;IAED,qEAAqE;IACrE,yEAAyE;IACzE,qEAAqE;IACrE,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACvE,MAAM,CAAC,yFAAyF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IACvI,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAA;IAC1C,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,CAAC,mEAAmE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACvG,CAAC;IACH,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,oBAAoB,EAAE,GAAG,WAAW,CAAC,CAAC,CAAA;IAEhF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;IACnC,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QACjE,eAAe,CAAC,UAAU,EAAE,mBAAmB,CAAC,UAAU,EAAE,eAAe,SAAS,GAAG,CAAC,CAAA;QACxF,MAAM,IAAI,GAAG,UAAU,EAAE,IAAI,CAAA;QAC7B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YAC7F,MAAM,CACJ,iDAAiD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4BAA4B;gBAC/F,iEAAiE,eAAe,eAAe,CAClG,CAAA;QACH,CAAC;QACD,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,CACJ,qDAAqD,IAAI,wCAAwC;gBAC/F,sBAAsB,CAAC,GAAG,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC5D,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,uBAAuB,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK;gBAClF,sFAAsF;gBACtF,iGAAiG;gBACjG,8BAA8B,CACjC,CAAA;QACH,CAAC;QACD,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,qDAAqD,IAAI,6BAA6B,CAAC,CAAA;QAChG,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEnB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9E,MAAM,CAAC,2CAA2C,IAAI,gCAAgC,CAAC,CAAA;QACzF,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAA;QAC7B,KAAK,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YACvE,eAAe,CAAC,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,EAAE,eAAe,SAAS,eAAe,aAAa,GAAG,CAAC,CAAA;YAChH,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,CAAA;YAC3B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5D,MAAM,CACJ,2CAA2C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,IAAI,aAAa;oBAC5F,0DAA0D,CAC7D,CAAA;YACH,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;gBACpC,MAAM,CACJ,+CAA+C,IAAI,eAAe,IAAI,WAAW,IAAI,CAAC,MAAM,GAAG;oBAC7F,2BAA2B,iBAAiB,GAAG,CAClD,CAAA;YACH,CAAC;YACD,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,MAAM,CACJ,+CAA+C,IAAI,IAAI,IAAI,uCAAuC;oBAChG,UAAU,CAAC,GAAG,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,kDAAkD,CAC7F,CAAA;YACH,CAAC;YACD,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;YAC/E,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CACJ,+CAA+C,IAAI,IAAI,IAAI,kBAAkB,MAAM,aAAa;oBAC9F,2DAA2D,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;oBACjG,kDAAkD,CACrD,CAAA;YACH,CAAC;YACD,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClB,MAAM,CAAC,+CAA+C,IAAI,IAAI,IAAI,6BAA6B,CAAC,CAAA;YAClG,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACf,CAAC;QAED,4EAA4E;QAC5E,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YAC5C,2EAA2E;YAC3E,2EAA2E;YAC3E,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzE,MAAM,CACJ,iDAAiD,IAAI,IAAI,QAAQ,CAAC,IAAI,sCAAsC;oBAC1G,sBAAsB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAC9D,CAAA;YACH,CAAC;YACD,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;gBAC/C,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBACjC,MAAM,CAAC,oDAAoD,IAAI,IAAI,QAAQ,CAAC,IAAI,qBAAqB,CAAC,CAAA;gBACxG,CAAC;gBACD,kFAAkF;gBAClF,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACpD,MAAM,CACJ,mCAAmC,IAAI,IAAI,QAAQ,CAAC,IAAI,cAAc,QAAQ,oBAAoB;wBAChG,wFAAwF,CAC3F,CAAA;gBACH,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACvB,MAAM,CACJ,mCAAmC,IAAI,IAAI,QAAQ,CAAC,IAAI,cAAc,QAAQ,mBAAmB;wBAC/F,gBAAgB,IAAI,0EAA0E,CACjG,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,sEAAsE;QACtE,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAyB,CAAC,EAAE,CAAC;gBAChE,MAAM,CACJ,+CAA+C,SAAS,eAAe,IAAI,QAAQ,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI;oBACpH,oHAAoH;oBACpH,8GAA8G;oBAC9G,gHAAgH;oBAChH,iFAAiF,CACpF,CAAA;YACH,CAAC;YACD,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gBAC5C,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,0BAA0B,EAAE,CAAC;oBACtD,MAAM,CACJ,+CAA+C,IAAI,IAAI,QAAQ,CAAC,IAAI,WAAW,QAAQ,CAAC,IAAI,CAAC,MAAM,mBAAmB;wBACpH,8CAA8C,oBAAoB,GAAG,QAAQ,CAAC,IAAI,mBAAmB;wBACrG,GAAG,iBAAiB,8DAA8D,0BAA0B,GAAG,CAClH,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,2EAA2E;QAC3E,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QACrD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CACJ,2DAA2D,IAAI,oBAAoB;gBACjF,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,oDAAoD;gBAC1G,4GAA4G;gBAC5G,mEAAmE,CACtE,CAAA;QACH,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAA;IAC/C,oEAAoE;IACpE,4EAA4E;IAC5E,4EAA4E;IAC5E,6EAA6E;IAC7E,4EAA4E;IAC5E,gDAAgD;IAChD,QAAQ,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,GAAG,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAA;IACzE,8EAA8E;IAC9E,oEAAoE;IACpE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;QACtD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAoC,EAAE,EAAE,CAClF,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CACxH,CAAA;QACD,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAA6B,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAChG,iHAAiH;QACjH,mEAAmE;QACnE,OAAO,UAAU,CAAC,IAAI,KAAK,SAAS;YAClC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/E,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAA;IAC1G,CAAC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;QACvC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,KAAK,IAAI;QAC5C,OAAO,EAAE,CAAC,UAAkB,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;QACzD,UAAU,EAAE,CAAC,UAAkB,EAAE,QAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK;KACvG,CAAoB,CAAA;AACvB,CAAC;AAED,oHAAoH;AAEpH,wFAAwF;AACxF,MAAM,UAAU,WAAW,CAAC,MAA4C,EAAE,UAAkB;IAC1F,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,IAAI,CAAA;AACpE,CAAC;AAED,8HAA8H;AAC9H,MAAM,UAAU,YAAY,CAAC,MAA4C;IACvE,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAA;AAC7D,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,GAAG,oBAAoB,GAAG,QAAQ,EAAE,CAAA;AAC7C,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,qFAAqF,CAAA;AAE9H;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,oBAAoB,CAAC,MAAM;QACzH,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;QACvE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,MAA4C,EAAE,UAAkB,EAAE,QAAgB;IAC9G,MAAM,GAAG,GAAG,IAAI,GAAG,CAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAA;IAClE,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxB,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QAC5B,MAAM,GAAG,GAAG,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAA;QAC3D,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBACZ,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAA;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAA4C,EAAE,UAAkB,EAAE,QAAgB;IAC5G,MAAM,GAAG,GAAG,IAAI,GAAG,CAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAA;IAClE,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxB,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QAC5B,KAAK,MAAM,SAAS,IAAI,IAAI,EAAE,SAAS,IAAI,EAAE,EAAE,CAAC;YAC9C,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7E,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;gBACvB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAA;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,MAA4C,EAC5C,UAAkB,EAClB,QAAgB,EAChB,OAA4B,EAC5B,MAA2B;IAE3B,KAAK,MAAM,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,SAAQ;QACnC,IAAI,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;IAChG,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,0HAA0H;AAC1H,MAAM,UAAU,aAAa,CAAC,MAA4C,EAAE,UAAkB,EAAE,QAAgB;IAC9G,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAA;IAC7B,KAAK,MAAM,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,CAAC;QAClE,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC9E,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAA;AACjB,CAAC;AAGD;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CACxB,MAA4C,EAC5C,UAAkB,EAClB,QAAgB,EAChB,OAA4B,EAC5B,MAA2B;IAE3B,IAAI,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC;QAAE,OAAO,OAAO,CAAA;IAChF,OAAO,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;AACjG,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA4C,EAAE,MAAwB,EAAE,QAAgB;IAC7H,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,KAAK,KAAK,OAAO;QAAE,OAAM;IAC7B,MAAM,GAAG,GACP,MAAM,CAAC,IAAI,KAAK,qBAAqB;QACnC,CAAC,CAAC,IAAI,qBAAqB,iGAAiG;YAC1H,4DAA4D;QAC9D,CAAC,CAAC,KAAK,KAAK,MAAM;YAChB,CAAC,CAAC,YAAY,MAAM,CAAC,IAAI,6FAA6F;gBACpH,gHAAgH;gBAChH,oBAAoB;YACtB,CAAC,CAAC,YAAY,MAAM,CAAC,IAAI,oGAAoG,CAAA;IACnI,MAAM,IAAI,wBAAwB,CAAC,YAAY,QAAQ,MAAM,MAAM,CAAC,IAAI,4BAA4B,GAAG,0BAA0B,CAAC,CAAA;AACpI,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAK,OAA8B,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QAC3F,MAAM,IAAI,wBAAwB,CAChC,wHAAwH;YACtH,iEAAiE,CACpE,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;QACrE,MAAM,IAAI,uBAAuB,CAC/B,oHAAoH;YAClH,oHAAoH;YACpH,sHAAsH;YACtH,iHAAiH;YACjH,4EAA4E,CAC/E,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { RelObject, RelSubject, RelationRef, RelationWriteEvent, RelationWriteOptions, RelationsDriver, RelationsDriverCapabilities, RelationObjectsPage, RelationSubjectsPage, RelationPage, RelationTuplePage, RelationPurgeOptions, ScopeRef } from '../types.js';
1
+ import type { RelObject, RelSubject, RelationRef, RelationWriteEvent, RelationWriteOptions, RelationsDriver, RelationsDriverCapabilities, RelationObjectsPage, RelationSubjectsPage, RelationPage, RelationTuplePage, RelationPurgeOptions, RelationDenyOptions, RelationDecision, ScopeRef } from '../types.js';
2
2
  import type { RelationsConfig } from './define_relations_config.js';
3
3
  export interface RelationsManagerOptions {
4
4
  /**
@@ -97,6 +97,37 @@ export declare class RelationsManager {
97
97
  * dice con esas palabras.
98
98
  */
99
99
  checkMany(subject: RelSubject, relation: string, objects: RelObject[], partition: ScopeRef): Promise<boolean[]>;
100
+ /**
101
+ * **El deny de relación** (plan 2.5 · lote D · D1; D3/D5/D8/D10). El MISMO embudo que `relate`, en este orden:
102
+ * puerta 1 de `{ transaction }`, barrera del freeze, F-05 (sobre el nombre PÚBLICO), la capacidad
103
+ * `relationDenies` (500 `E_AUTHZ_UNSUPPORTED` con cero llamadas, como `membersOf`: D-28), la puerta del opt-in
104
+ * (solo un tipo en fase `'write'`; sin opt-in, en `'read'` o sobre `group` ⇒ 422 `E_AUTHZ_RELATION_NOT_DENYABLE`,
105
+ * D-17), sin caducidad (D3: `expiresAt` ⇒ 422), id, actor, partición (D4), sujeto (`*` ⇒ 422, userset solo
106
+ * `group#member`), `assertWrite` con `operation: 'deny'`, `#write` (invariante 13) y `#notify`. **Corte de camino**
107
+ * (D5): un deny en `editor` anula entero un grant de `owner` sobre ese objeto; solo sobrevive un `viewer` directo.
108
+ */
109
+ deny(subject: RelSubject, relation: string, object: RelObject, partition: ScopeRef, options?: RelationDenyOptions): Promise<void>;
110
+ /**
111
+ * **Retira un deny** (lote D). El embudo de `deny` SIN la puerta del opt-in: acepta CUALQUIER tipo declarado
112
+ * (D8/R2-4 b: retirar el opt-in de un tipo con denies vivos tiene que ser reversible, y los denies se tienen que
113
+ * poder borrar). Ojo, fila declarada (S8–S10 del tester): quitar un deny CONCEDE — `assertWrite` lo ve con
114
+ * `operation: 'removeDeny'`.
115
+ */
116
+ removeDeny(subject: RelSubject, relation: string, object: RelObject, partition: ScopeRef, options?: RelationDenyOptions): Promise<void>;
117
+ /** Los sujetos con deny DIRECTO de `relation` sobre `object` (hechos: no resta ni deriva). Cualquier tipo declarado (D8). */
118
+ listDenies(relation: string, object: RelObject, partition: ScopeRef, page?: RelationPage): Promise<RelationSubjectsPage>;
119
+ /**
120
+ * **La primitiva de CADENA** (lote D · D9, decisión del dueño 2026-10-14): una decisión por objeto, POR POSICIÓN —
121
+ * `allow` si `check` concede aquí; si no, `deny` si el sujeto tiene un deny vivo (directo o por grupo, anidado)
122
+ * sobre ALGUNA relación de `up*(down*(R))` en el objeto; si no, `none`—. Recorre la cadena de la hoja hacia arriba
123
+ * y para en el primer valor que no sea `none`. Las MISMAS garantías que `checkMany`: tope
124
+ * `RELATIONS_CHECK_MANY_MAX` (50) y `[]` ⇒ 422 `E_AUTHZ_CHECK_MANY_BATCH` con cero llamadas, F-05 y el id POR
125
+ * ÍTEM, un `now` por lote en el driver, orden de salida = orden de entrada, y un error en UN ítem ⇒ 503 para todo
126
+ * el lote (nunca `none` por ítem: `none` en vez de `deny` dejaría que la cadena del llamante siguiera subiendo, S15).
127
+ * La respuesta del driver se valida (una decisión por posición, sin huecos, o 500 `E_AUTHZ_INTERNAL`). Sin
128
+ * `relationDenies` ⇒ 500 `E_AUTHZ_UNSUPPORTED` (D-28): sin deny no hay tri-estado que prometer.
129
+ */
130
+ decideMany(subject: RelSubject, relation: string, objects: RelObject[], partition: ScopeRef): Promise<RelationDecision[]>;
100
131
  listObjects(subject: RelSubject, relation: string, objectType: string, partition: ScopeRef, page?: RelationPage): Promise<RelationObjectsPage>;
101
132
  listSubjects(relation: string, object: RelObject, partition: ScopeRef, page?: RelationPage): Promise<RelationSubjectsPage>;
102
133
  /**
@@ -110,7 +141,7 @@ export declare class RelationsManager {
110
141
  * notifica también cuando no borra nada: el hecho auditable es «alguien
111
142
  * pidió borrar las llaves de X». Sujeta a `requireActor` (D-3, breaking) y
112
143
  * al actor validado; NO pasa por `assertWrite` (su `RelationRef.operation`
113
- * es `'relate' | 'unrelate'`, tipo publicado de R-13). Mismo `#write`
144
+ * es `'relate' | 'unrelate' | 'deny' | 'removeDeny'`, tipo publicado de R-13). Mismo `#write`
114
145
  * (invariante 13) y mismo `#notify` que `relate`/`unrelate`.
115
146
  *
116
147
  * **Y pasan por F-05** (cierre del 🔴 1 del auditor de alpha.3): el mismo
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/relations/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/relations/manager.ts"],"names":[],"mappings":"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"}