@jantstack/adonis-authz 2.4.0-alpha.9 → 2.5.0-alpha.2

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 (128) hide show
  1. package/README.md +468 -30
  2. package/build/commands/authz_freeze.js +1 -1
  3. package/build/commands/authz_freeze.js.map +1 -1
  4. package/build/commands/authz_reconcile.d.ts +6 -2
  5. package/build/commands/authz_reconcile.d.ts.map +1 -1
  6. package/build/commands/authz_reconcile.js +129 -13
  7. package/build/commands/authz_reconcile.js.map +1 -1
  8. package/build/commands/authz_relations_reconcile.d.ts +16 -24
  9. package/build/commands/authz_relations_reconcile.d.ts.map +1 -1
  10. package/build/commands/authz_relations_reconcile.js +198 -49
  11. package/build/commands/authz_relations_reconcile.js.map +1 -1
  12. package/build/commands/authz_scopes_relay.d.ts.map +1 -1
  13. package/build/commands/authz_scopes_relay.js +81 -1
  14. package/build/commands/authz_scopes_relay.js.map +1 -1
  15. package/build/commands/authz_unfreeze.d.ts +12 -4
  16. package/build/commands/authz_unfreeze.d.ts.map +1 -1
  17. package/build/commands/authz_unfreeze.js +74 -9
  18. package/build/commands/authz_unfreeze.js.map +1 -1
  19. package/build/index.d.ts +6 -4
  20. package/build/index.d.ts.map +1 -1
  21. package/build/index.js +5 -3
  22. package/build/index.js.map +1 -1
  23. package/build/providers/authz_provider.d.ts +1 -1
  24. package/build/providers/authz_provider.d.ts.map +1 -1
  25. package/build/providers/authz_provider.js +5 -1
  26. package/build/providers/authz_provider.js.map +1 -1
  27. package/build/src/define_config.d.ts +41 -0
  28. package/build/src/define_config.d.ts.map +1 -1
  29. package/build/src/define_config.js +120 -0
  30. package/build/src/define_config.js.map +1 -1
  31. package/build/src/drivers/database_driver.d.ts.map +1 -1
  32. package/build/src/drivers/database_driver.js +1 -0
  33. package/build/src/drivers/database_driver.js.map +1 -1
  34. package/build/src/drivers/database_relations_driver.d.ts +18 -6
  35. package/build/src/drivers/database_relations_driver.d.ts.map +1 -1
  36. package/build/src/drivers/database_relations_driver.js +94 -46
  37. package/build/src/drivers/database_relations_driver.js.map +1 -1
  38. package/build/src/drivers/openfga_driver.d.ts +46 -5
  39. package/build/src/drivers/openfga_driver.d.ts.map +1 -1
  40. package/build/src/drivers/openfga_driver.js +115 -29
  41. package/build/src/drivers/openfga_driver.js.map +1 -1
  42. package/build/src/drivers/openfga_relations_driver.d.ts +82 -13
  43. package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -1
  44. package/build/src/drivers/openfga_relations_driver.js +216 -55
  45. package/build/src/drivers/openfga_relations_driver.js.map +1 -1
  46. package/build/src/errors.d.ts +86 -0
  47. package/build/src/errors.d.ts.map +1 -1
  48. package/build/src/errors.js +86 -0
  49. package/build/src/errors.js.map +1 -1
  50. package/build/src/freeze.d.ts +63 -4
  51. package/build/src/freeze.d.ts.map +1 -1
  52. package/build/src/freeze.js +107 -18
  53. package/build/src/freeze.js.map +1 -1
  54. package/build/src/identity.d.ts +120 -9
  55. package/build/src/identity.d.ts.map +1 -1
  56. package/build/src/identity.js +164 -12
  57. package/build/src/identity.js.map +1 -1
  58. package/build/src/manager.d.ts +64 -2
  59. package/build/src/manager.d.ts.map +1 -1
  60. package/build/src/manager.js +267 -35
  61. package/build/src/manager.js.map +1 -1
  62. package/build/src/openfga.d.ts +2 -2
  63. package/build/src/openfga.d.ts.map +1 -1
  64. package/build/src/openfga.js +2 -2
  65. package/build/src/openfga.js.map +1 -1
  66. package/build/src/relations/check_many.d.ts +17 -0
  67. package/build/src/relations/check_many.d.ts.map +1 -0
  68. package/build/src/relations/check_many.js +57 -0
  69. package/build/src/relations/check_many.js.map +1 -0
  70. package/build/src/relations/define_relations_config.d.ts +74 -1
  71. package/build/src/relations/define_relations_config.d.ts.map +1 -1
  72. package/build/src/relations/define_relations_config.js +201 -7
  73. package/build/src/relations/define_relations_config.js.map +1 -1
  74. package/build/src/relations/manager.d.ts +20 -0
  75. package/build/src/relations/manager.d.ts.map +1 -1
  76. package/build/src/relations/manager.js +88 -15
  77. package/build/src/relations/manager.js.map +1 -1
  78. package/build/src/relations/reconcile.d.ts +134 -3
  79. package/build/src/relations/reconcile.d.ts.map +1 -1
  80. package/build/src/relations/reconcile.js +340 -36
  81. package/build/src/relations/reconcile.js.map +1 -1
  82. package/build/src/relations/tuple_key.d.ts +25 -0
  83. package/build/src/relations/tuple_key.d.ts.map +1 -0
  84. package/build/src/relations/tuple_key.js +60 -0
  85. package/build/src/relations/tuple_key.js.map +1 -0
  86. package/build/src/relations_config_store.d.ts.map +1 -1
  87. package/build/src/relations_config_store.js +29 -7
  88. package/build/src/relations_config_store.js.map +1 -1
  89. package/build/src/relations_reconcile.d.ts +79 -0
  90. package/build/src/relations_reconcile.d.ts.map +1 -0
  91. package/build/src/relations_reconcile.js +85 -0
  92. package/build/src/relations_reconcile.js.map +1 -0
  93. package/build/src/scope_outbox.d.ts +9 -5
  94. package/build/src/scope_outbox.d.ts.map +1 -1
  95. package/build/src/scope_outbox.js +7 -4
  96. package/build/src/scope_outbox.js.map +1 -1
  97. package/build/src/shared/backend_guard.d.ts +30 -11
  98. package/build/src/shared/backend_guard.d.ts.map +1 -1
  99. package/build/src/shared/backend_guard.js +45 -15
  100. package/build/src/shared/backend_guard.js.map +1 -1
  101. package/build/src/shared/sql_expiry.d.ts +2 -0
  102. package/build/src/shared/sql_expiry.d.ts.map +1 -1
  103. package/build/src/shared/sql_expiry.js +4 -0
  104. package/build/src/shared/sql_expiry.js.map +1 -1
  105. package/build/src/testing/main.d.ts +3 -1
  106. package/build/src/testing/main.d.ts.map +1 -1
  107. package/build/src/testing/main.js +2 -1
  108. package/build/src/testing/main.js.map +1 -1
  109. package/build/src/testing/migration_contract.d.ts +9 -0
  110. package/build/src/testing/migration_contract.d.ts.map +1 -1
  111. package/build/src/testing/migration_contract.js +5 -2
  112. package/build/src/testing/migration_contract.js.map +1 -1
  113. package/build/src/testing/relations_contract.d.ts +14 -0
  114. package/build/src/testing/relations_contract.d.ts.map +1 -1
  115. package/build/src/testing/relations_contract.js +367 -21
  116. package/build/src/testing/relations_contract.js.map +1 -1
  117. package/build/src/testing/scope_outbox_contract.d.ts +14 -1
  118. package/build/src/testing/scope_outbox_contract.d.ts.map +1 -1
  119. package/build/src/testing/scope_outbox_contract.js +126 -48
  120. package/build/src/testing/scope_outbox_contract.js.map +1 -1
  121. package/build/src/testing/test_clock.d.ts +15 -0
  122. package/build/src/testing/test_clock.d.ts.map +1 -0
  123. package/build/src/testing/test_clock.js +65 -0
  124. package/build/src/testing/test_clock.js.map +1 -0
  125. package/build/src/types.d.ts +115 -12
  126. package/build/src/types.d.ts.map +1 -1
  127. package/build/src/types.js.map +1 -1
  128. package/package.json +6 -1
@@ -0,0 +1,57 @@
1
+ /**
2
+ * **`checkMany` — lo que comparten el manager y los dos drivers** (plan 2.5 ·
3
+ * lote A, P4 del 7.º informe de COGNITIV; `panel-tenencia-juez.md` §P4):
4
+ * el tope del lote, la validación de su forma y el reparto de duplicados.
5
+ *
6
+ * - **Tope 50** (`RELATIONS_CHECK_MANY_MAX`, = `FGA_MAX_BATCH_CHECK`): por
7
+ * encima es 422 con CERO llamadas al backend, nunca un troceo silencioso
8
+ * que esconda el coste; `[]` también es 422 (un lote vacío no es una
9
+ * pregunta, y `[]` ⇒ `[]` se confundía con «todo denegado»).
10
+ * - **Duplicados permitidos, respuesta por POSICIÓN**: `[a, a, b]` ⇒
11
+ * `[x, x, y]`. Los drivers preguntan una vez por objeto distinto y
12
+ * reparten (`distinctObjects`).
13
+ *
14
+ * Pureza (regla 2): sin backend, sin manager.
15
+ */
16
+ import { CheckManyBatchError } from '../errors.js';
17
+ /** Objetos por lote de `checkMany`. Es el tope de `batchCheck` del servidor FGA (50), para que un lote sea UNA request. */
18
+ export const RELATIONS_CHECK_MANY_MAX = 50;
19
+ /** `objects` es un array con 1..RELATIONS_CHECK_MANY_MAX elementos, o 422 (`E_AUTHZ_CHECK_MANY_BATCH`) sin tocar nada. */
20
+ export function assertCheckManyObjects(objects) {
21
+ if (!Array.isArray(objects)) {
22
+ throw new CheckManyBatchError(`checkMany: 'objects' tiene que ser un array de objetos (llegó ${typeof objects}).`);
23
+ }
24
+ if (objects.length === 0) {
25
+ throw new CheckManyBatchError('checkMany: el lote está VACÍO. Un lote sin objetos no es una pregunta (y `[]` ⇒ `[]` se leería como «todo denegado»): pasa al menos un objeto.');
26
+ }
27
+ if (objects.length > RELATIONS_CHECK_MANY_MAX) {
28
+ throw new CheckManyBatchError(`checkMany: el lote tiene ${objects.length} objetos y el tope es ${RELATIONS_CHECK_MANY_MAX} (RELATIONS_CHECK_MANY_MAX, ` +
29
+ `= el tope de batchCheck del servidor): trocea en el llamante. No se ha preguntado nada.`);
30
+ }
31
+ }
32
+ /**
33
+ * Los objetos DISTINTOS del lote (por `type:id`, en orden de primera aparición)
34
+ * y, por posición del lote, el índice del distinto que la responde. Con
35
+ * `[a, a, b]` ⇒ `distinct = [a, b]`, `index = [0, 0, 1]`.
36
+ */
37
+ export function distinctObjects(objects) {
38
+ const seen = new Map();
39
+ const distinct = [];
40
+ const index = [];
41
+ for (const object of objects) {
42
+ const key = `${object.type}:${object.id}`;
43
+ let at = seen.get(key);
44
+ if (at === undefined) {
45
+ at = distinct.length;
46
+ seen.set(key, at);
47
+ distinct.push(object);
48
+ }
49
+ index.push(at);
50
+ }
51
+ return { distinct, index };
52
+ }
53
+ /** Reparte las respuestas de los objetos DISTINTOS a las posiciones del lote. */
54
+ export function expandByPosition(index, answers) {
55
+ return index.map((at) => answers[at]);
56
+ }
57
+ //# sourceMappingURL=check_many.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check_many.js","sourceRoot":"","sources":["../../../src/relations/check_many.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAGlD,2HAA2H;AAC3H,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAA;AAE1C,0HAA0H;AAC1H,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,mBAAmB,CAAC,iEAAiE,OAAO,OAAO,IAAI,CAAC,CAAA;IACpH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,mBAAmB,CAC3B,gJAAgJ,CACjJ,CAAA;IACH,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC;QAC9C,MAAM,IAAI,mBAAmB,CAC3B,4BAA4B,OAAO,CAAC,MAAM,yBAAyB,wBAAwB,8BAA8B;YACvH,yFAAyF,CAC5F,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAoB;IAClD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAA;IACtC,MAAM,QAAQ,GAAgB,EAAE,CAAA;IAChC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,EAAE,CAAA;QACzC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACtB,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACrB,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAA;YACpB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YACjB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;AAC5B,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,gBAAgB,CAAC,KAAe,EAAE,OAAkB;IAClE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;AACvC,CAAC"}
@@ -1,4 +1,29 @@
1
- import type { RelObject } from '../types.js';
1
+ import type { RelObject, RelUserset } from '../types.js';
2
+ /**
3
+ * **El ÚNICO userset que el modelo admite como sujeto** (plan 2.5 · lote B · B3):
4
+ * `group#member`. El generador del modelo fusionado emite, para CADA relación de
5
+ * dominio, `[<holders> with not_expired, group#member]` y nada más; `group` es el
6
+ * tipo BUILT-IN (`declared.set('group', …)` abajo) y el consumidor no lo declara.
7
+ */
8
+ export declare const RELATION_USERSET_TYPE = "group";
9
+ export declare const RELATION_USERSET_RELATION = "member";
10
+ /**
11
+ * **Listas blancas por nivel de la spec** (plan 2.5 · lote B · B2; linaje L5,
12
+ * propiedad universal «ninguna clave de una spec de config se descarta»).
13
+ * Una clave que no está en la lista de SU nivel es 422
14
+ * `E_AUTHZ_RELATION_CONFIG_UNKNOWN_KEY` nombrando la ruta (`objectTypes[1].deny`)
15
+ * y la lista. Hasta `2.5.0-alpha.1` la config congelada copiaba solo lo que
16
+ * conocía y tiraba el resto en silencio (tester H3, medido: `deny: true` y
17
+ * `denny: 1` desaparecían): un typo era una entrada inerte, y el lote D (deny)
18
+ * habría nacido con la clave `deny` leída por un proceso viejo como «nada».
19
+ * Las claves del lote D entran AQUÍ, en el mismo commit que su efecto.
20
+ */
21
+ export declare const RELATIONS_SPEC_KEYS: Readonly<{
22
+ root: readonly ["objectTypes", "holderTypes", "database"];
23
+ objectType: readonly ["type", "relations"];
24
+ relation: readonly ["name", "includes"];
25
+ database: readonly ["membersOf"];
26
+ }>;
2
27
  /** Una relación de un tipo de objeto (`document#viewer`), con sus `includes` de un nivel. */
3
28
  export interface RelationObjectRelationSpec {
4
29
  /** El nombre de la relación (`owner`, `editor`, `viewer`). */
@@ -101,6 +126,54 @@ export declare function assertRelationDeclared(config: RelationsConfig, object:
101
126
  export declare function assertObjectTypeDeclared(config: RelationsConfig, object: RelObject | {
102
127
  type: string;
103
128
  }): void;
129
+ /**
130
+ * **B3 · el userset del SUJETO: F-05 (par) y, además, `group#member` y solo
131
+ * `group#member`** (plan 2.5 · lote B; auditor [N 9] de la ronda 1, analista
132
+ * B(2); patrón F-05 `assertRelationDeclared`: UNA función, misma clase, mismo
133
+ * `code` y mismo mensaje por cualquier puerta). Hasta `2.5.0-alpha.1` un
134
+ * `{ object: document, relation: viewer }` como sujeto pasaba F-05 (tipo y
135
+ * relación declarados) y después: `database` guardaba la fila INERTE (ningún
136
+ * holder la alcanza: la expansión de principales solo baja por `group#member`)
137
+ * y `openfga` componía `document:<key>|<id>#viewer` como `user`, que el modelo
138
+ * fusionado no admite ⇒ 400 del servidor ⇒ 503 mal clasificado (invariante 5:
139
+ * una pregunta inválida es 422, no una caída). La aplican el `RelationsManager`
140
+ * (`#assertSubject`), los DOS drivers (`#subjectColumns` / `#subjectUser`) y el
141
+ * doble publicado, en TODA operación que recibe sujeto —`relate`/`unrelate`/
142
+ * `check`/`checkMany`/`listObjects`/`purgeSubject`—, ANTES de tocar el backend
143
+ * (cero `INSERT`, cero `Write`/`Read`/`Check`). La guardia de superficie lo
144
+ * sondea como variante de F-05 (`usersetUnsupported`) con un mutante por capa.
145
+ */
146
+ export declare function assertUsersetSubject(config: RelationsConfig, subject: RelUserset): void;
147
+ /**
148
+ * **La mitad de B3 que no necesita config**: `group#member` y solo `group#member`
149
+ * (cierre 1 del lote B · 🟠 2). Es la regla que `reconcileRelations` aplica en el
150
+ * PLAN a cada tupla ENUMERADA —del origen y del destino— también cuando no hay
151
+ * `toConfig` (sin config no se puede juzgar F-05 del par, pero la forma del
152
+ * userset sí): así un residuo pre-2.5 se clasifica ANTES del driver, con los
153
+ * mismos números en `--dry-run` y en la pasada real. **En el plan la FORMA va
154
+ * ANTES que F-05** (cierre 2 · 🟡 N2): un residuo B3 es inadmisible con
155
+ * cualquier config, así que un userset de tipo/relación no declarados sigue
156
+ * siendo residuo (`usersetUnsupported`, con receta) y nunca `undeclared` (cuyo
157
+ * consejo «decláralo» no lo arreglaría). En la API (`assertUsersetSubject`,
158
+ * la pregunta del llamante) el orden sigue siendo F-05 → forma: los dos son
159
+ * 422 y ninguno escribe.
160
+ */
161
+ export declare function assertSupportedUserset(subject: RelUserset): void;
162
+ /**
163
+ * **El residuo pre-2.5 de B3 y cómo se borra** (cierre 1 del lote B · 🟠 1/🟠 2,
164
+ * ⚪ 12): una fila de `authz_relations` escrita ANTES de 2.5.0 con un sujeto
165
+ * userset ≠ `group#member`. La API ya no la admite (ni `relate`, ni `unrelate`,
166
+ * ni `purgeSubject(userset)`), el reconcile la LISTA con este motivo y **nunca
167
+ * la borra por vía de plataforma** (decisión del coordinador, 2026-10-15: la
168
+ * misma regla que toda tupla del destino fuera de gramática — se lista, exit
169
+ * ≠ 0, se borra a mano). Las dos sentencias valen en los tres motores
170
+ * (`subject_relation <> ''` excluye los holders, también los `NULL` de antes
171
+ * de L-4b: `NULL <> ''` es NULL ⇒ falso); `upgrade_recipe.spec` las EJECUTA y
172
+ * el README §Upgrading las publica literalmente.
173
+ */
174
+ export declare const RELATION_USERSET_RESIDUE_WHERE = "subject_relation <> '' AND NOT (subject_type = 'group' AND subject_relation = 'member')";
175
+ export declare const RELATION_USERSET_RESIDUE_SELECT = "SELECT uuid, partition_key, object_type, object_uuid, relation, subject_type, subject_uuid, subject_relation FROM authz_relations WHERE subject_relation <> '' AND NOT (subject_type = 'group' AND subject_relation = 'member');";
176
+ export declare const RELATION_USERSET_RESIDUE_DELETE = "DELETE FROM authz_relations WHERE subject_relation <> '' AND NOT (subject_type = 'group' AND subject_relation = 'member');";
104
177
  /**
105
178
  * Valida y congela la config de relaciones. Config inválida ⇒ 422
106
179
  * `E_AUTHZ_RELATION_CONFIG` (misma clase que el gate del modelo del lote 4-1).
@@ -1 +1 @@
1
- {"version":3,"file":"define_relations_config.d.ts","sourceRoot":"","sources":["../../../src/relations/define_relations_config.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAQ5C,6FAA6F;AAC7F,MAAM,WAAW,0BAA0B;IACzC,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7B;AAED,wEAAwE;AACxE,MAAM,WAAW,sBAAsB;IACrC,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,+CAA+C;IAC/C,SAAS,EAAE,SAAS,0BAA0B,EAAE,CAAA;CACjD;AAED,kDAAkD;AAClD,MAAM,WAAW,wBAAwB;IACvC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,2CAA2C;AAC3C,MAAM,WAAW,mBAAmB;IAClC,4CAA4C;IAC5C,WAAW,EAAE,SAAS,sBAAsB,EAAE,CAAA;IAC9C;;;;OAIG;IACH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC/B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,wBAAwB,CAAA;CACpC;AAED,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,SAAS,sBAAsB,EAAE,CAAA;IACvD,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,wDAAwD;IACxD,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAA;IACpC,8EAA8E;IAC9E,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;CAC1D;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACpC,QAAQ,EAAE,MAAM,GACf,IAAI,CAeN;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAc5G;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,eAAe,CA0IhF"}
1
+ {"version":3,"file":"define_relations_config.d.ts","sourceRoot":"","sources":["../../../src/relations/define_relations_config.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExD;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,UAAU,CAAA;AAC5C,eAAO,MAAM,yBAAyB,WAAW,CAAA;AAQjD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB;;;;;EAK9B,CAAA;AA0FF,6FAA6F;AAC7F,MAAM,WAAW,0BAA0B;IACzC,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7B;AAED,wEAAwE;AACxE,MAAM,WAAW,sBAAsB;IACrC,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,+CAA+C;IAC/C,SAAS,EAAE,SAAS,0BAA0B,EAAE,CAAA;CACjD;AAED,kDAAkD;AAClD,MAAM,WAAW,wBAAwB;IACvC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,2CAA2C;AAC3C,MAAM,WAAW,mBAAmB;IAClC,4CAA4C;IAC5C,WAAW,EAAE,SAAS,sBAAsB,EAAE,CAAA;IAC9C;;;;OAIG;IACH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC/B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,wBAAwB,CAAA;CACpC;AAED,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,SAAS,sBAAsB,EAAE,CAAA;IACvD,2DAA2D;IAC3D,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,wDAAwD;IACxD,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAA;IACpC,8EAA8E;IAC9E,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;CAC1D;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACpC,QAAQ,EAAE,MAAM,GACf,IAAI,CAeN;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAc5G;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,CAGvF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAShE;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,8BAA8B,4FACyF,CAAA;AACpI,eAAO,MAAM,+BAA+B,qOACkI,CAAA;AAC9K,eAAO,MAAM,+BAA+B,+HAAyE,CAAA;AAErH;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,eAAe,CAsLhF"}
@@ -16,13 +16,112 @@
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, 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;
23
31
  const OBJECT_TYPE_MAX = 254;
24
32
  /** Nombres FGA: minúsculas, dígitos y `._-`; sin `:`/`#`/`@`/espacios ni `|`. */
25
33
  const FGA_NAME_FORMAT = /^[a-z0-9][a-z0-9._-]*$/;
34
+ /**
35
+ * **Listas blancas por nivel de la spec** (plan 2.5 · lote B · B2; linaje L5,
36
+ * propiedad universal «ninguna clave de una spec de config se descarta»).
37
+ * Una clave que no está en la lista de SU nivel es 422
38
+ * `E_AUTHZ_RELATION_CONFIG_UNKNOWN_KEY` nombrando la ruta (`objectTypes[1].deny`)
39
+ * y la lista. Hasta `2.5.0-alpha.1` la config congelada copiaba solo lo que
40
+ * conocía y tiraba el resto en silencio (tester H3, medido: `deny: true` y
41
+ * `denny: 1` desaparecían): un typo era una entrada inerte, y el lote D (deny)
42
+ * habría nacido con la clave `deny` leída por un proceso viejo como «nada».
43
+ * Las claves del lote D entran AQUÍ, en el mismo commit que su efecto.
44
+ */
45
+ export const RELATIONS_SPEC_KEYS = Object.freeze({
46
+ root: Object.freeze(['objectTypes', 'holderTypes', 'database']),
47
+ objectType: Object.freeze(['type', 'relations']),
48
+ relation: Object.freeze(['name', 'includes']),
49
+ database: Object.freeze(['membersOf']),
50
+ });
51
+ const _exhaustiveRelationsRoot = {};
52
+ const _exhaustiveRelationsObjectType = {};
53
+ const _exhaustiveRelationsRelation = {};
54
+ const _exhaustiveRelationsDatabase = {};
55
+ void _exhaustiveRelationsRoot, _exhaustiveRelationsObjectType, _exhaustiveRelationsRelation, _exhaustiveRelationsDatabase;
56
+ RELATIONS_SPEC_KEYS.root;
57
+ RELATIONS_SPEC_KEYS.objectType;
58
+ RELATIONS_SPEC_KEYS.relation;
59
+ RELATIONS_SPEC_KEYS.database;
60
+ /** ⚪ 13: una clave de BLOQUE conocida con un valor que no es un objeto plano (`database: true`) es 422, no silencio. */
61
+ function assertObjectBlock(value, path) {
62
+ if (value === undefined)
63
+ return;
64
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
65
+ throw new RelationConfigError(`Config de relaciones inválida: '${path}' tiene que ser un objeto (llegó ${JSON.stringify(value)}). ` +
66
+ `Un valor que no es objeto en una clave conocida no es «nada»: se ignoraría en silencio.`);
67
+ }
68
+ }
69
+ /** Toda clave PROPIA de `value` tiene que estar en `known`; si no, 422 con la ruta y la lista blanca del nivel. */
70
+ function assertKnownKeys(value, known, path) {
71
+ if (!value || typeof value !== 'object' || Array.isArray(value))
72
+ return;
73
+ for (const key of Object.keys(value)) {
74
+ if (known.includes(key))
75
+ continue;
76
+ const where = path === '' ? `'${key}' en la raíz de la spec` : `'${path}.${key}'`;
77
+ throw new RelationConfigUnknownKeyError(`Config de relaciones inválida: la clave ${where} no existe (claves válidas en ${path === '' ? 'la raíz' : path}: ${known.join(', ')}). ` +
78
+ `Ninguna clave de la spec se descarta en silencio: un typo ('denny') o una clave de otra versión del paquete ` +
79
+ `sería una entrada inerte que el modelo publicado no refleja. Quítala o corrige el nombre.`);
80
+ }
81
+ }
82
+ /**
83
+ * **B1 · ciclos de `includes`** (plan 2.5 · lote B; analista M3 / tester H4,
84
+ * medidos): `editor ⊇ viewer ⊇ editor` se aceptaba — `database` lo SIRVE (la
85
+ * expansión termina por el `Set`) y OpenFGA rechaza CUALQUIER ciclo al
86
+ * publicar el modelo, así que la paridad estaba rota desde el config. Es
87
+ * config, no driver: el mismo 422 vale para los dos ANTES de construir nada.
88
+ * DFS con pila de colores sobre el grafo `relation → includes` del tipo;
89
+ * devuelve el ciclo NOMBRADO (`a → b → a`, desde el nodo que lo cierra, no
90
+ * desde la raíz por la que se entró) o `null`. Un ciclo directo (`a ⊇ a`) es
91
+ * el caso de longitud 1 del mismo recorrido.
92
+ */
93
+ function findIncludesCycle(relations) {
94
+ const edges = new Map();
95
+ for (const relation of relations)
96
+ edges.set(relation.name, relation.includes ?? []);
97
+ const state = new Map();
98
+ const stack = [];
99
+ const visit = (name) => {
100
+ const mark = state.get(name);
101
+ if (mark === 'done')
102
+ return null;
103
+ if (mark === 'visiting') {
104
+ const start = stack.indexOf(name);
105
+ return [...stack.slice(start), name];
106
+ }
107
+ state.set(name, 'visiting');
108
+ stack.push(name);
109
+ for (const next of edges.get(name) ?? []) {
110
+ const cycle = visit(next);
111
+ if (cycle)
112
+ return cycle;
113
+ }
114
+ stack.pop();
115
+ state.set(name, 'done');
116
+ return null;
117
+ };
118
+ for (const relation of relations) {
119
+ const cycle = visit(relation.name);
120
+ if (cycle)
121
+ return cycle;
122
+ }
123
+ return null;
124
+ }
26
125
  function reject(message) {
27
126
  throw new RelationConfigError(message);
28
127
  }
@@ -93,6 +192,64 @@ export function assertObjectTypeDeclared(config, object) {
93
192
  `'role_binding' real y escalar a roles.authorize, purgarlo o enumerar sus asignados.`);
94
193
  }
95
194
  }
195
+ /**
196
+ * **B3 · el userset del SUJETO: F-05 (par) y, además, `group#member` y solo
197
+ * `group#member`** (plan 2.5 · lote B; auditor [N 9] de la ronda 1, analista
198
+ * B(2); patrón F-05 `assertRelationDeclared`: UNA función, misma clase, mismo
199
+ * `code` y mismo mensaje por cualquier puerta). Hasta `2.5.0-alpha.1` un
200
+ * `{ object: document, relation: viewer }` como sujeto pasaba F-05 (tipo y
201
+ * relación declarados) y después: `database` guardaba la fila INERTE (ningún
202
+ * holder la alcanza: la expansión de principales solo baja por `group#member`)
203
+ * y `openfga` componía `document:<key>|<id>#viewer` como `user`, que el modelo
204
+ * fusionado no admite ⇒ 400 del servidor ⇒ 503 mal clasificado (invariante 5:
205
+ * una pregunta inválida es 422, no una caída). La aplican el `RelationsManager`
206
+ * (`#assertSubject`), los DOS drivers (`#subjectColumns` / `#subjectUser`) y el
207
+ * doble publicado, en TODA operación que recibe sujeto —`relate`/`unrelate`/
208
+ * `check`/`checkMany`/`listObjects`/`purgeSubject`—, ANTES de tocar el backend
209
+ * (cero `INSERT`, cero `Write`/`Read`/`Check`). La guardia de superficie lo
210
+ * sondea como variante de F-05 (`usersetUnsupported`) con un mutante por capa.
211
+ */
212
+ export function assertUsersetSubject(config, subject) {
213
+ assertRelationDeclared(config, subject.object, subject.relation);
214
+ assertSupportedUserset(subject);
215
+ }
216
+ /**
217
+ * **La mitad de B3 que no necesita config**: `group#member` y solo `group#member`
218
+ * (cierre 1 del lote B · 🟠 2). Es la regla que `reconcileRelations` aplica en el
219
+ * PLAN a cada tupla ENUMERADA —del origen y del destino— también cuando no hay
220
+ * `toConfig` (sin config no se puede juzgar F-05 del par, pero la forma del
221
+ * userset sí): así un residuo pre-2.5 se clasifica ANTES del driver, con los
222
+ * mismos números en `--dry-run` y en la pasada real. **En el plan la FORMA va
223
+ * ANTES que F-05** (cierre 2 · 🟡 N2): un residuo B3 es inadmisible con
224
+ * cualquier config, así que un userset de tipo/relación no declarados sigue
225
+ * siendo residuo (`usersetUnsupported`, con receta) y nunca `undeclared` (cuyo
226
+ * consejo «decláralo» no lo arreglaría). En la API (`assertUsersetSubject`,
227
+ * la pregunta del llamante) el orden sigue siendo F-05 → forma: los dos son
228
+ * 422 y ninguno escribe.
229
+ */
230
+ export function assertSupportedUserset(subject) {
231
+ if (subject.object.type !== RELATION_USERSET_TYPE || subject.relation !== RELATION_USERSET_RELATION) {
232
+ throw new RelationUsersetUnsupportedError(`El userset '${subject.object.type}#${subject.relation}' no vale como SUJETO de una relación (B3): el modelo ` +
233
+ `solo admite '${RELATION_USERSET_TYPE}#${RELATION_USERSET_RELATION}' como sujeto de una relación de dominio. ` +
234
+ `En 'database' esa fila sería inerte (ningún holder la alcanza) y en 'openfga' un 400 del servidor; ` +
235
+ `relaciona al holder o al grupo, no a la relación de otro objeto.`);
236
+ }
237
+ }
238
+ /**
239
+ * **El residuo pre-2.5 de B3 y cómo se borra** (cierre 1 del lote B · 🟠 1/🟠 2,
240
+ * ⚪ 12): una fila de `authz_relations` escrita ANTES de 2.5.0 con un sujeto
241
+ * userset ≠ `group#member`. La API ya no la admite (ni `relate`, ni `unrelate`,
242
+ * ni `purgeSubject(userset)`), el reconcile la LISTA con este motivo y **nunca
243
+ * la borra por vía de plataforma** (decisión del coordinador, 2026-10-15: la
244
+ * misma regla que toda tupla del destino fuera de gramática — se lista, exit
245
+ * ≠ 0, se borra a mano). Las dos sentencias valen en los tres motores
246
+ * (`subject_relation <> ''` excluye los holders, también los `NULL` de antes
247
+ * de L-4b: `NULL <> ''` es NULL ⇒ falso); `upgrade_recipe.spec` las EJECUTA y
248
+ * el README §Upgrading las publica literalmente.
249
+ */
250
+ export const RELATION_USERSET_RESIDUE_WHERE = `subject_relation <> '' AND NOT (subject_type = '${RELATION_USERSET_TYPE}' AND subject_relation = '${RELATION_USERSET_RELATION}')`;
251
+ 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};`;
252
+ export const RELATION_USERSET_RESIDUE_DELETE = `DELETE FROM authz_relations WHERE ${RELATION_USERSET_RESIDUE_WHERE};`;
96
253
  /**
97
254
  * Valida y congela la config de relaciones. Config inválida ⇒ 422
98
255
  * `E_AUTHZ_RELATION_CONFIG` (misma clase que el gate del modelo del lote 4-1).
@@ -101,6 +258,15 @@ export function defineRelationsConfig(spec) {
101
258
  if (!spec || typeof spec !== 'object') {
102
259
  reject(`Config de relaciones inválida: se esperaba un objeto y llegó ${JSON.stringify(spec)}.`);
103
260
  }
261
+ // ⚪ 13 (cierre 1 del lote B): una config YA DEFINIDA (la salida de esta misma
262
+ // función: `isDeclared`/`hasType` son funciones) pasada como spec —el tipo
263
+ // estructural lo permite, p. ej. `saveRelationsConfig(config.relations.config)`—
264
+ // moría en «'membersOf' en la raíz no existe» sin pista. Se dice lo que es.
265
+ if (typeof spec.isDeclared === 'function' && typeof spec.hasType === 'function') {
266
+ reject(`Config de relaciones inválida: parece una config YA DEFINIDA (la salida de defineRelationsConfig: lleva ` +
267
+ `isDeclared/hasType), no la spec. Pasa la spec declarativa ({ objectTypes, holderTypes?, database? }) — ` +
268
+ `también a saveRelationsConfig, que persiste la spec, no la config congelada.`);
269
+ }
104
270
  // `membersOf` SOLO puede vivir en las opciones de `database` (⚪ del tester):
105
271
  // ponerlo en la raíz o en un futuro bloque `openfga` es un error de
106
272
  // configuración —`openfga` no puede resolver la transitiva sin truncar—.
@@ -109,9 +275,22 @@ export function defineRelationsConfig(spec) {
109
275
  `(membresía transitiva por CTE recursiva) y va en 'database.membersOf', no en la raíz. ` +
110
276
  `En 'openfga' la transitiva sería 'ListUsers', que trunca al tope del servidor.`);
111
277
  }
278
+ // B2: la raíz, ANTES de leer nada de ella (un `deny: true` aquí no es «nada»).
279
+ assertKnownKeys(spec, RELATIONS_SPEC_KEYS.root, '');
280
+ // ⚪ 13 (cierre 1 del lote B; L5): un valor que NO es objeto en una clave
281
+ // conocida de bloque (`database: true`) se ignoraba en silencio —`assertKnownKeys`
282
+ // sale si no es objeto y `spec.database?.membersOf` daba `undefined`—. Es 422.
283
+ assertObjectBlock(spec.database, 'database');
284
+ assertKnownKeys(spec.database, RELATIONS_SPEC_KEYS.database, 'database');
112
285
  if (!Array.isArray(spec.objectTypes) || spec.objectTypes.length === 0) {
113
286
  reject(`Config de relaciones inválida: 'objectTypes' tiene que ser un array no vacío.`);
114
287
  }
288
+ // ⚪ N7 (cierre 2 del lote B): una cadena se ITERABA por caracteres y
289
+ // desactivaba la colisión ⚪4 (`holderTypes: 'user'` + `{ type: 'user' }`
290
+ // entraba). L5: ningún valor con forma equivocada cae en un default.
291
+ if (spec.holderTypes !== undefined && !Array.isArray(spec.holderTypes)) {
292
+ reject(`Config de relaciones inválida: 'holderTypes' tiene que ser un array de cadenas (llegó ${JSON.stringify(spec.holderTypes)}).`);
293
+ }
115
294
  const holderTypes = spec.holderTypes ?? [];
116
295
  for (const holder of holderTypes) {
117
296
  if (typeof holder !== 'string') {
@@ -120,7 +299,8 @@ export function defineRelationsConfig(spec) {
120
299
  }
121
300
  const reservedTypes = new Set([...RESERVED_FACTS_TYPES, ...holderTypes]);
122
301
  const seenTypes = new Set();
123
- for (const objectType of spec.objectTypes) {
302
+ for (const [typeIndex, objectType] of spec.objectTypes.entries()) {
303
+ assertKnownKeys(objectType, RELATIONS_SPEC_KEYS.objectType, `objectTypes[${typeIndex}]`);
124
304
  const type = objectType?.type;
125
305
  if (typeof type !== 'string' || !FGA_NAME_FORMAT.test(type) || type.length > OBJECT_TYPE_MAX) {
126
306
  reject(`Config de relaciones inválida: tipo de objeto ${JSON.stringify(type)} no es un tipo FGA válido ` +
@@ -142,7 +322,8 @@ export function defineRelationsConfig(spec) {
142
322
  reject(`Config de relaciones inválida: el tipo '${type}' no declara ninguna relación.`);
143
323
  }
144
324
  const own = new Set();
145
- for (const relation of objectType.relations) {
325
+ for (const [relationIndex, relation] of objectType.relations.entries()) {
326
+ assertKnownKeys(relation, RELATIONS_SPEC_KEYS.relation, `objectTypes[${typeIndex}].relations[${relationIndex}]`);
146
327
  const name = relation?.name;
147
328
  if (typeof name !== 'string' || !FGA_NAME_FORMAT.test(name)) {
148
329
  reject(`Config de relaciones inválida: relación ${JSON.stringify(name)} del tipo '${type}' no es un ` +
@@ -169,6 +350,12 @@ export function defineRelationsConfig(spec) {
169
350
  }
170
351
  // Los `includes` refieren relaciones del MISMO tipo (un nivel, SIN `from`).
171
352
  for (const relation of objectType.relations) {
353
+ // ⚪ 13 (cierre 1 del lote B): `includes: {}` (o cualquier no-array) era un
354
+ // `TypeError` crudo del `for…of`; es una config inválida, 422 con la ruta.
355
+ if (relation.includes !== undefined && !Array.isArray(relation.includes)) {
356
+ reject(`Config de relaciones inválida: 'includes' de '${type}#${relation.name}' tiene que ser un array de nombres ` +
357
+ `de relación (llegó ${JSON.stringify(relation.includes)}).`);
358
+ }
172
359
  for (const included of relation.includes ?? []) {
173
360
  if (typeof included !== 'string') {
174
361
  reject(`Config de relaciones inválida: un 'includes' de '${type}#${relation.name}' no es una cadena.`);
@@ -182,11 +369,16 @@ export function defineRelationsConfig(spec) {
182
369
  reject(`Config de relaciones inválida: '${type}#${relation.name}' incluye '${included}', que no es una ` +
183
370
  `relación de '${type}'. Los includes son de un nivel y del mismo tipo (v1 no soporta 'from').`);
184
371
  }
185
- if (included === relation.name) {
186
- reject(`Config de relaciones inválida: '${type}#${relation.name}' se incluye a sí misma.`);
187
- }
188
372
  }
189
373
  }
374
+ // B1: ningún ciclo en el grafo de includes del tipo (directo, de 2, de N).
375
+ const cycle = findIncludesCycle(objectType.relations);
376
+ if (cycle) {
377
+ reject(`Config de relaciones inválida: los 'includes' del tipo '${type}' forman un ciclo ` +
378
+ `(${cycle.map((name) => `${type}#${name}`).join(' → ')}). OpenFGA rechaza cualquier ciclo al publicar el ` +
379
+ `modelo y 'database' lo serviría igual: sería una config que un driver acepta y el otro no (paridad rota). ` +
380
+ `Los includes son un orden parcial: quita la arista que lo cierra.`);
381
+ }
190
382
  }
191
383
  const declared = new Map();
192
384
  // `group` es el tipo BUILT-IN de las relaciones (el portador de los
@@ -195,7 +387,9 @@ export function defineRelationsConfig(spec) {
195
387
  // pero SÍ es un tipo válido para F-05: `relate(group:g#member, viewer, doc)`
196
388
  // y `relate(u, member, group:g)` son legales. `role_binding`/`scope`/`role`
197
389
  // siguen fuera: la frontera del 🔴 se mantiene.
198
- declared.set('group', new Set(['member']));
390
+ declared.set(RELATION_USERSET_TYPE, new Set([RELATION_USERSET_RELATION]));
391
+ // Desde B2 la copia congelada no «tira» nada: toda clave que llega hasta aquí
392
+ // está en la lista blanca de su nivel (lo demás ya fue 422 arriba).
199
393
  const frozenTypes = spec.objectTypes.map((objectType) => {
200
394
  const relations = objectType.relations.map((relation) => Object.freeze({ name: relation.name, includes: relation.includes ? Object.freeze([...relation.includes]) : undefined }));
201
395
  declared.set(objectType.type, new Set(relations.map((r) => r.name)));
@@ -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":"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"}
@@ -77,6 +77,26 @@ export declare class RelationsManager {
77
77
  * cero llamadas al driver; el driver re-valida (defensa en profundidad).
78
78
  */
79
79
  check(subject: RelSubject, relation: string, object: RelObject, partition: ScopeRef): Promise<boolean>;
80
+ /**
81
+ * **N `check` en UNA pregunta, por posición** (plan 2.5 · lote A, P4 del
82
+ * 7.º informe de COGNITIV: «la cadena de ancestros en una llamada»). Misma
83
+ * semántica que N `check` (includes, usersets, caducidad con UN `now` por
84
+ * lote cuando lo resuelve el driver), tope `RELATIONS_CHECK_MANY_MAX` (50)
85
+ * y lote vacío ⇒ 422 `E_AUTHZ_CHECK_MANY_BATCH` con CERO llamadas; F-05 y
86
+ * la gramática del id **por ÍTEM** (un `role_binding` en la posición 21 de
87
+ * 21 es 422 y no se pregunta nada); duplicados permitidos y respondidos por
88
+ * posición. Si el driver no trae `checkMany` el manager COMPONE N `check`
89
+ * —correcto, N round-trips, cada uno con su instante— y el primer 503
90
+ * propaga sin que salga ningún booleano. La respuesta de un driver de
91
+ * terceros se valida (un `boolean[]` con exactamente una posición por
92
+ * objeto, o 500 `E_AUTHZ_INTERNAL` nombrándolo: paridad con `authorizeMany`).
93
+ *
94
+ * **Lo que NO es**: `false` no distingue «denegado aquí» de «nada aquí», así
95
+ * que `checkMany` no sirve para un deny-wins sobre una cadena de objetos
96
+ * que recorra el llamante — eso es `decideMany` (lote D), y el README lo
97
+ * dice con esas palabras.
98
+ */
99
+ checkMany(subject: RelSubject, relation: string, objects: RelObject[], partition: ScopeRef): Promise<boolean[]>;
80
100
  listObjects(subject: RelSubject, relation: string, objectType: string, partition: ScopeRef, page?: RelationPage): Promise<RelationObjectsPage>;
81
101
  listSubjects(relation: string, object: RelObject, partition: ScopeRef, page?: RelationPage): Promise<RelationSubjectsPage>;
82
102
  /**
@@ -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":"AAkCA,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,2BAA2B,EAC3B,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EAEZ,iBAAiB,EAEjB,oBAAoB,EACpB,QAAQ,EAET,MAAM,aAAa,CAAA;AAGpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAGnE,MAAM,WAAW,uBAAuB;IACtC;;;;;;;;OAQG;IACH,WAAW,CAAC,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAAA;IACpC;;;;;;;;;OASG;IACH,eAAe,CAAC,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAA;IACjD,oFAAoF;IACpF,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;IAClB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;;;OAMG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAA;IACpC,uHAAuH;IACvH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAuBD,qBAAa,gBAAgB;;gBAKf,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,GAAE,uBAA4B;IAoJnG,iFAAiF;IACjF,MAAM,IAAI,eAAe;IAIzB;;;;;;;;;;OAUG;IACH,YAAY,IAAI,QAAQ,CAAC,2BAA2B,CAAC;IAyG/C,MAAM,CACV,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,IAAI,CAAC;IAmBV,QAAQ,CACZ,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,IAAI,CAAC;IAehB;;;;;;;;;OASG;IACG,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ5G;;;;;;;;;;;;;;;;;;OAkBG;IACG,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA8B/G,WAAW,CACf,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,QAAQ,EACnB,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC,mBAAmB,CAAC;IAOzB,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,QAAQ,EACnB,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC,oBAAoB,CAAC;IAOhC;;;;;;;;;;;;;;;;;;;OAmBG;IACG,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBlG,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3G;;;;;;OAMG;IACG,SAAS,CACb,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,QAAQ,EACnB,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC,oBAAoB,CAAC;IAqBhC,oGAAoG;IAC9F,kBAAkB,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAY9F;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,sBAAsB,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA8CtG"}