@pimia/sdk 0.10.0 → 0.12.0

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.
package/dist/api.d.ts CHANGED
@@ -192,6 +192,22 @@ export interface paths {
192
192
  patch?: never;
193
193
  trace?: never;
194
194
  };
195
+ "/contracts/{contract}/activate": {
196
+ parameters: {
197
+ query?: never;
198
+ header?: never;
199
+ path?: never;
200
+ cookie?: never;
201
+ };
202
+ get?: never;
203
+ put?: never;
204
+ post: operations["contract.activateContract"];
205
+ delete?: never;
206
+ options?: never;
207
+ head?: never;
208
+ patch?: never;
209
+ trace?: never;
210
+ };
195
211
  "/app/version": {
196
212
  parameters: {
197
213
  query?: never;
@@ -454,6 +470,22 @@ export interface paths {
454
470
  patch?: never;
455
471
  trace?: never;
456
472
  };
473
+ "/contracts/{contract}/cancel": {
474
+ parameters: {
475
+ query?: never;
476
+ header?: never;
477
+ path?: never;
478
+ cookie?: never;
479
+ };
480
+ get?: never;
481
+ put?: never;
482
+ post: operations["contract.cancelContract"];
483
+ delete?: never;
484
+ options?: never;
485
+ head?: never;
486
+ patch?: never;
487
+ trace?: never;
488
+ };
457
489
  "/estimates/{estimate}/status": {
458
490
  parameters: {
459
491
  query?: never;
@@ -704,6 +736,10 @@ export interface paths {
704
736
  * `active_tokens` se queda como estaba (cuenta los PAT del client, rotados
705
737
  * aún no caducados incluidos) para no romper a quien ya lo lee; lo que
706
738
  * cuenta dispositivos es `credentials`.
739
+ *
740
+ * El grant del panel de primera parte NO sale: el panel es la casa, no una
741
+ * app conectada (ver el docblock de la clase). Solo se listan las
742
+ * invitadas — conectores, el escritorio y las apps de integradores.
707
743
  */
708
744
  get: operations["connectedApps.index"];
709
745
  put?: never;
@@ -736,10 +772,11 @@ export interface paths {
736
772
  * que el resto de la pantalla (este usuario, este tenant, sin revocar), así
737
773
  * que la ruta no lo nombra: no hay forma de pedir un par descuadrado.
738
774
  *
739
- * 404 cuando la credencial no existe, no es de este usuario o ya no está
740
- * viva (rotada, revocada o caducada): quien cierra estaba mirando una lista
741
- * de hace un momento y lo que necesita es recargarla, no un error distinto
742
- * por cada motivo.
775
+ * 404 cuando la credencial no existe, no es de este usuario, ya no está
776
+ * viva (rotada, revocada o caducada) o es del panel de primera parte,
777
+ * que esta superficie no ve (docblock de la clase): quien cierra estaba
778
+ * mirando una lista de hace un momento y lo que necesita es recargarla, no
779
+ * un error distinto por cada motivo.
743
780
  */
744
781
  delete: operations["connectedApps.destroyCredential"];
745
782
  options?: never;
@@ -761,6 +798,9 @@ export interface paths {
761
798
  * Retira el acceso de la app entera: cae el grant, sus refresh tokens y los
762
799
  * PAT que esa app acuñó para este usuario. Todas sus credenciales con él
763
800
  * @description **Reservada al panel de Pimia.** Exige `admin:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
801
+ *
802
+ * El grant del panel de primera parte contesta 404: la casa no es una app
803
+ * conectada y esta superficie no lo ve (docblock de la clase).
764
804
  */
765
805
  delete: operations["connectedApps.destroy"];
766
806
  options?: never;
@@ -800,6 +840,79 @@ export interface paths {
800
840
  patch?: never;
801
841
  trace?: never;
802
842
  };
843
+ "/contracts/{contract}/document": {
844
+ parameters: {
845
+ query?: never;
846
+ header?: never;
847
+ path?: never;
848
+ cookie?: never;
849
+ };
850
+ get?: never;
851
+ put?: never;
852
+ post: operations["contractDocument.upload"];
853
+ delete: operations["contractDocument.destroy"];
854
+ options?: never;
855
+ head?: never;
856
+ patch?: never;
857
+ trace?: never;
858
+ };
859
+ "/contracts/delete": {
860
+ parameters: {
861
+ query?: never;
862
+ header?: never;
863
+ path?: never;
864
+ cookie?: never;
865
+ };
866
+ get?: never;
867
+ put?: never;
868
+ /**
869
+ * Borrado en lote (`POST /contracts/delete`). Fail-loud: un id no
870
+ * borrable aborta el lote entero antes de borrar nada
871
+ */
872
+ post: operations["contracts.delete"];
873
+ delete?: never;
874
+ options?: never;
875
+ head?: never;
876
+ patch?: never;
877
+ trace?: never;
878
+ };
879
+ "/contracts": {
880
+ parameters: {
881
+ query?: never;
882
+ header?: never;
883
+ path?: never;
884
+ cookie?: never;
885
+ };
886
+ get: operations["contracts.index"];
887
+ put?: never;
888
+ post: operations["contracts.store"];
889
+ delete?: never;
890
+ options?: never;
891
+ head?: never;
892
+ patch?: never;
893
+ trace?: never;
894
+ };
895
+ "/contracts/{contract}": {
896
+ parameters: {
897
+ query?: never;
898
+ header?: never;
899
+ path?: never;
900
+ cookie?: never;
901
+ };
902
+ get: operations["contracts.show"];
903
+ put: operations["contracts.update"];
904
+ post?: never;
905
+ /**
906
+ * Borra UN contrato, el de la ruta. Solo en borrador: lo activo se
907
+ * cancela, no se borra (decisión 8) — y eso es un 422 con el porqué, no
908
+ * un 500 ni un borrado a medias
909
+ */
910
+ delete: operations["contracts.destroy"];
911
+ options?: never;
912
+ head?: never;
913
+ patch?: never;
914
+ trace?: never;
915
+ };
803
916
  "/estimates/{estimate}/convert-to-invoice": {
804
917
  parameters: {
805
918
  query?: never;
@@ -1088,41 +1201,57 @@ export interface paths {
1088
1201
  patch?: never;
1089
1202
  trace?: never;
1090
1203
  };
1091
- "/delivery-notes/{id}/mark-delivered": {
1204
+ "/delegable-tasks": {
1092
1205
  parameters: {
1093
1206
  query?: never;
1094
1207
  header?: never;
1095
1208
  path?: never;
1096
1209
  cookie?: never;
1097
1210
  };
1098
- get?: never;
1211
+ /**
1212
+ * Catálogo de operaciones delegables de esta instancia
1213
+ * @description **Reservada al panel de Pimia.** Exige `delegation:read`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
1214
+ *
1215
+ * Solo las filas del propio tenant: lo que la instancia hereda no se pinta
1216
+ * aquí, así que un tenant que no ha descubierto nada arranca vacío.
1217
+ * `hermes_configured` dice si hay instancia de agente operable — sin ella,
1218
+ * el resto de la pantalla no tiene nada que activar.
1219
+ */
1220
+ get: operations["delegableCatalog.index"];
1099
1221
  put?: never;
1100
- /** Mark delivery note as delivered */
1101
- post: operations["deliveryNotes.markDelivered"];
1222
+ post?: never;
1102
1223
  delete?: never;
1103
1224
  options?: never;
1104
1225
  head?: never;
1105
1226
  patch?: never;
1106
1227
  trace?: never;
1107
1228
  };
1108
- "/delivery-notes/{id}/convert-to-invoice": {
1229
+ "/delegable-tasks/delegations": {
1109
1230
  parameters: {
1110
1231
  query?: never;
1111
1232
  header?: never;
1112
1233
  path?: never;
1113
1234
  cookie?: never;
1114
1235
  };
1115
- get?: never;
1236
+ /**
1237
+ * Las tareas delegadas del tenant: las 20 últimas, y TODAS las que esperan
1238
+ * decisión
1239
+ * @description **Reservada al panel de Pimia.** Exige `delegation:read`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
1240
+ *
1241
+ * Las que están pendientes de decidir entran siempre, aunque caigan fuera de
1242
+ * esas 20: esta es la única superficie donde se aprueban, así que un
1243
+ * checkpoint abierto no puede quedar enterrado por el volumen.
1244
+ */
1245
+ get: operations["delegableCatalog.delegations"];
1116
1246
  put?: never;
1117
- /** Convert delivery note to invoice */
1118
- post: operations["deliveryNotes.convertToInvoice"];
1247
+ post?: never;
1119
1248
  delete?: never;
1120
1249
  options?: never;
1121
1250
  head?: never;
1122
1251
  patch?: never;
1123
1252
  trace?: never;
1124
1253
  };
1125
- "/delivery-notes/delete": {
1254
+ "/delegable-tasks/delegations/{id}/approve": {
1126
1255
  parameters: {
1127
1256
  query?: never;
1128
1257
  header?: never;
@@ -1131,92 +1260,132 @@ export interface paths {
1131
1260
  };
1132
1261
  get?: never;
1133
1262
  put?: never;
1134
- /** Delete multiple delivery notes */
1135
- post: operations["deliveryNotes.deleteMultiple"];
1263
+ /**
1264
+ * El dueño APRUEBA la propuesta: el checkpoint humano del
1265
+ * preview-antes-de-aplicar
1266
+ * @description **Reservada al panel de Pimia.** Exige `delegation:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
1267
+ *
1268
+ * Solo sobre una tarea viva con una propuesta en `proposed` o
1269
+ * `needs_changes`; cualquier otra cosa es `404`. Aprobar no aplica nada por
1270
+ * sí mismo: el agente recibe el aviso y aplica su propuesta, y la tarea se
1271
+ * cierra cuando él reporta el resultado. `applied_at` es lo que dice que la
1272
+ * aplicación ocurrió de verdad.
1273
+ *
1274
+ * Opcionalmente se reporta lo que costó verificarla —`human_touch_minutes`
1275
+ * y `verification_outcome` (`pass` si se aprobó tal cual, `edit` si hubo que
1276
+ * corregir)—: es la medida del coste humano de la delegación.
1277
+ */
1278
+ post: operations["delegableCatalog.approveProposal"];
1136
1279
  delete?: never;
1137
1280
  options?: never;
1138
1281
  head?: never;
1139
1282
  patch?: never;
1140
1283
  trace?: never;
1141
1284
  };
1142
- "/delivery-notes": {
1285
+ "/delegable-tasks/delegations/{id}/reject": {
1143
1286
  parameters: {
1144
1287
  query?: never;
1145
1288
  header?: never;
1146
1289
  path?: never;
1147
1290
  cookie?: never;
1148
1291
  };
1149
- /** List all delivery notes */
1150
- get: operations["delivery-notes.index"];
1292
+ get?: never;
1151
1293
  put?: never;
1152
- /** Store a new delivery note */
1153
- post: operations["delivery-notes.store"];
1294
+ /**
1295
+ * El dueño RECHAZA la propuesta: no se aplica nada y la tarea queda fallida
1296
+ * @description **Reservada al panel de Pimia.** Exige `delegation:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
1297
+ *
1298
+ * Es terminal, y por eso se separa de «pedir cambios»: no habrá otra
1299
+ * propuesta sobre esta tarea. Admite `reason` —que se guarda como resultado
1300
+ * de la tarea— y los `human_touch_minutes` que costó decidirlo, porque
1301
+ * rechazar también es verificar.
1302
+ */
1303
+ post: operations["delegableCatalog.rejectProposal"];
1154
1304
  delete?: never;
1155
1305
  options?: never;
1156
1306
  head?: never;
1157
1307
  patch?: never;
1158
1308
  trace?: never;
1159
1309
  };
1160
- "/delivery-notes/{delivery_note}": {
1161
- parameters: {
1162
- query?: never;
1163
- header?: never;
1164
- path?: never;
1165
- cookie?: never;
1166
- };
1167
- /** Show a single delivery note */
1168
- get: operations["delivery-notes.show"];
1169
- /** Update a delivery note */
1170
- put: operations["delivery-notes.update"];
1171
- post?: never;
1172
- /** Delete a delivery note */
1173
- delete: operations["delivery-notes.destroy"];
1174
- options?: never;
1175
- head?: never;
1176
- patch?: never;
1177
- trace?: never;
1178
- };
1179
- "/employees": {
1310
+ "/delegable-tasks/delegations/{id}/needs-changes": {
1180
1311
  parameters: {
1181
1312
  query?: never;
1182
1313
  header?: never;
1183
1314
  path?: never;
1184
1315
  cookie?: never;
1185
1316
  };
1186
- get: operations["employees.index"];
1317
+ get?: never;
1187
1318
  put?: never;
1188
- post: operations["employees.store"];
1319
+ /**
1320
+ * El dueño PIDE CAMBIOS sobre la propuesta, sin cerrarla
1321
+ * @description **Reservada al panel de Pimia.** Exige `delegation:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
1322
+ *
1323
+ * NO es una decisión, y por eso no es terminal: la tarea sigue en curso, el
1324
+ * agente re-arranca, lee el `reason` y vuelve a proponer. Desde aquí se
1325
+ * puede seguir aprobando o rechazando —la propuesta original queda intacta—,
1326
+ * así que pedir cambios no quema el checkpoint: lo mantiene abierto.
1327
+ */
1328
+ post: operations["delegableCatalog.needsChangesProposal"];
1189
1329
  delete?: never;
1190
1330
  options?: never;
1191
1331
  head?: never;
1192
1332
  patch?: never;
1193
1333
  trace?: never;
1194
1334
  };
1195
- "/employees/{employee}": {
1335
+ "/delegable-tasks/{task_type}": {
1196
1336
  parameters: {
1197
1337
  query?: never;
1198
1338
  header?: never;
1199
1339
  path?: never;
1200
1340
  cookie?: never;
1201
1341
  };
1202
- get: operations["employees.show"];
1203
- put: operations["employees.update"];
1342
+ get?: never;
1343
+ /**
1344
+ * Alta o activación de una operación delegable
1345
+ * @description **Reservada al panel de Pimia.** Exige `delegation:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
1346
+ *
1347
+ * Sirve para activar una fila existente o para añadir una skill descubierta.
1348
+ * La activación EXIGE verificación viva contra la instancia: si la skill no
1349
+ * está montada, se responde `422` con `verified: false` y el catálogo no se
1350
+ * toca. `201` si la fila se creó, `200` si ya existía.
1351
+ */
1352
+ put: operations["delegableCatalog.upsert"];
1204
1353
  post?: never;
1205
- delete: operations["employees.destroy"];
1354
+ /**
1355
+ * Desactiva una operación delegable. NO la borra
1356
+ * @description **Reservada al panel de Pimia.** Exige `delegation:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
1357
+ *
1358
+ * La fila se conserva —con su verificación— para poder reactivarla rápido;
1359
+ * lo que cambia es `enabled`, y con eso deja de ser delegable. Un tipo que
1360
+ * la instancia hereda y del que este tenant no tiene fila propia se apaga
1361
+ * igual: se crea el apagado local que lo oculta aquí.
1362
+ */
1363
+ delete: operations["delegableCatalog.disable"];
1206
1364
  options?: never;
1207
1365
  head?: never;
1208
1366
  patch?: never;
1209
1367
  trace?: never;
1210
1368
  };
1211
- "/estimates/pdf/{estimate}": {
1369
+ "/delegable-tasks/discover": {
1212
1370
  parameters: {
1213
1371
  query?: never;
1214
1372
  header?: never;
1215
1373
  path?: never;
1216
1374
  cookie?: never;
1217
1375
  };
1218
- /** Handle the incoming request */
1219
- get: operations["pdf.estimatePdf"];
1376
+ /**
1377
+ * Lo que el agente de esta instancia sabe hacer, consultado en vivo
1378
+ * @description **Reservada al panel de Pimia.** Exige `delegation:read`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
1379
+ *
1380
+ * Devuelve las skills montadas en la instancia del tenant marcando cuáles
1381
+ * ya están en el catálogo (`in_catalog`) y cuáles están activadas
1382
+ * (`enabled`). Es la lista sobre la que el dueño activa operaciones.
1383
+ *
1384
+ * Llamada SALIENTE y síncrona: `409` si el tenant no tiene instancia y
1385
+ * `502` si no se pudo determinar el inventario (la instancia no responde).
1386
+ * Un 502 aquí no significa «ninguna skill»: significa que no se sabe.
1387
+ */
1388
+ get: operations["delegableCatalog.discover"];
1220
1389
  put?: never;
1221
1390
  post?: never;
1222
1391
  delete?: never;
@@ -1225,67 +1394,88 @@ export interface paths {
1225
1394
  patch?: never;
1226
1395
  trace?: never;
1227
1396
  };
1228
- "/estimate-series": {
1397
+ "/delegable-tasks/{task_type}/reverify": {
1229
1398
  parameters: {
1230
1399
  query?: never;
1231
1400
  header?: never;
1232
1401
  path?: never;
1233
1402
  cookie?: never;
1234
1403
  };
1235
- get: operations["estimate-series.index"];
1404
+ get?: never;
1236
1405
  put?: never;
1237
- post: operations["estimate-series.store"];
1406
+ /**
1407
+ * Re-comprueba contra la instancia que la skill de una operación sigue
1408
+ * montada
1409
+ * @description **Reservada al panel de Pimia.** Exige `delegation:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
1410
+ *
1411
+ * Invariante: activa ⇒ verificada. Si la skill ya no verifica, la operación
1412
+ * se desactiva en la misma llamada, y la respuesta lo dice en `verified`.
1413
+ */
1414
+ post: operations["delegableCatalog.reverify"];
1238
1415
  delete?: never;
1239
1416
  options?: never;
1240
1417
  head?: never;
1241
1418
  patch?: never;
1242
1419
  trace?: never;
1243
1420
  };
1244
- "/estimate-series/{estimateSeries}": {
1421
+ "/delegable-tasks/execute": {
1245
1422
  parameters: {
1246
1423
  query?: never;
1247
1424
  header?: never;
1248
1425
  path?: never;
1249
1426
  cookie?: never;
1250
1427
  };
1251
- get: operations["estimate-series.show"];
1252
- put: operations["estimate-series.update"];
1253
- post?: never;
1428
+ get?: never;
1429
+ put?: never;
1254
1430
  /**
1255
- * Baja lógica, nunca borrado: los presupuestos ya numerados con la serie
1256
- * siguen apuntándola y su `estimates_count` es lo que explica por qué el
1257
- * contador va por donde va
1431
+ * Ejecución SÍNCRONA de prueba: «Probar» una operación y ver la respuesta
1432
+ * @description **Reservada al panel de Pimia.** Exige `delegation:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
1433
+ *
1434
+ * El dueño manda un prompt en vivo al agente de su instancia y recibe lo que
1435
+ * conteste. Es la versión síncrona, para probar; la delegación de verdad es
1436
+ * asíncrona y va por `delegate`.
1437
+ *
1438
+ * Si se indica `task_type`, la operación debe estar ACTIVADA (`422` si no) y
1439
+ * se le pide al agente que use esa skill. Fail-closed: `409` sin instancia y
1440
+ * `502` si no responde.
1258
1441
  */
1259
- delete: operations["estimate-series.destroy"];
1442
+ post: operations["delegableCatalog.execute"];
1443
+ delete?: never;
1260
1444
  options?: never;
1261
1445
  head?: never;
1262
1446
  patch?: never;
1263
1447
  trace?: never;
1264
1448
  };
1265
- "/estimates/templates": {
1449
+ "/delegable-tasks/delegate": {
1266
1450
  parameters: {
1267
1451
  query?: never;
1268
1452
  header?: never;
1269
1453
  path?: never;
1270
1454
  cookie?: never;
1271
1455
  };
1456
+ get?: never;
1457
+ put?: never;
1272
1458
  /**
1273
- * Galería de diseños base de presupuesto
1274
- * @description Un elemento por diseño. `path` es la URL pública de su miniatura (un
1275
- * recurso estático del producto, igual para todas las instancias y
1276
- * cacheable), o `''` si el diseño no tiene miniatura. Hasta el #415 venía
1277
- * incrustada en base64 y la respuesta pesaba más de un megabyte.
1459
+ * Delega una tarea al agente. Asíncrona: se crea y se entrega
1460
+ * @description **Reservada al panel de Pimia.** Exige `delegation:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
1461
+ *
1462
+ * La tarea aparece en el Copilot del tenant y el agente la trabaja; el
1463
+ * resultado vuelve después por sus callbacks, así que lo que se consulta
1464
+ * luego es `delegable-tasks/delegations`, no esta respuesta. Si se indica
1465
+ * `task_type`, la operación debe estar ACTIVADA (`422` si no).
1466
+ *
1467
+ * `201` cuando se entregó. Si la instancia no la acepta, la tarea queda
1468
+ * creada y `pending`, y se responde `502` con la tarea en el cuerpo: es una
1469
+ * entrega fallida, no una tarea perdida.
1278
1470
  */
1279
- get: operations["estimate.estimateTemplates"];
1280
- put?: never;
1281
- post?: never;
1471
+ post: operations["delegableCatalog.delegate"];
1282
1472
  delete?: never;
1283
1473
  options?: never;
1284
1474
  head?: never;
1285
1475
  patch?: never;
1286
1476
  trace?: never;
1287
1477
  };
1288
- "/estimates/delete": {
1478
+ "/delivery-notes/{id}/mark-delivered": {
1289
1479
  parameters: {
1290
1480
  query?: never;
1291
1481
  header?: never;
@@ -1294,103 +1484,300 @@ export interface paths {
1294
1484
  };
1295
1485
  get?: never;
1296
1486
  put?: never;
1297
- post: operations["estimates.delete"];
1487
+ /** Mark delivery note as delivered */
1488
+ post: operations["deliveryNotes.markDelivered"];
1298
1489
  delete?: never;
1299
1490
  options?: never;
1300
1491
  head?: never;
1301
1492
  patch?: never;
1302
1493
  trace?: never;
1303
1494
  };
1304
- "/estimates": {
1495
+ "/delivery-notes/{id}/convert-to-invoice": {
1305
1496
  parameters: {
1306
1497
  query?: never;
1307
1498
  header?: never;
1308
1499
  path?: never;
1309
1500
  cookie?: never;
1310
1501
  };
1311
- get: operations["estimates.index"];
1502
+ get?: never;
1312
1503
  put?: never;
1313
- post: operations["estimates.store"];
1504
+ /** Convert delivery note to invoice */
1505
+ post: operations["deliveryNotes.convertToInvoice"];
1314
1506
  delete?: never;
1315
1507
  options?: never;
1316
1508
  head?: never;
1317
1509
  patch?: never;
1318
1510
  trace?: never;
1319
1511
  };
1320
- "/estimates/{estimate}": {
1512
+ "/delivery-notes/delete": {
1321
1513
  parameters: {
1322
1514
  query?: never;
1323
1515
  header?: never;
1324
1516
  path?: never;
1325
1517
  cookie?: never;
1326
1518
  };
1327
- get: operations["estimates.show"];
1328
- put: operations["estimates.update"];
1329
- post?: never;
1519
+ get?: never;
1520
+ put?: never;
1521
+ /** Delete multiple delivery notes */
1522
+ post: operations["deliveryNotes.deleteMultiple"];
1330
1523
  delete?: never;
1331
1524
  options?: never;
1332
1525
  head?: never;
1333
1526
  patch?: never;
1334
1527
  trace?: never;
1335
1528
  };
1336
- "/categories": {
1529
+ "/delivery-notes": {
1337
1530
  parameters: {
1338
1531
  query?: never;
1339
1532
  header?: never;
1340
1533
  path?: never;
1341
1534
  cookie?: never;
1342
1535
  };
1343
- /** Display a listing of the resource */
1344
- get: operations["categories.index"];
1536
+ /** List all delivery notes */
1537
+ get: operations["delivery-notes.index"];
1345
1538
  put?: never;
1346
- /** Store a newly created resource in storage */
1347
- post: operations["categories.store"];
1539
+ /** Store a new delivery note */
1540
+ post: operations["delivery-notes.store"];
1348
1541
  delete?: never;
1349
1542
  options?: never;
1350
1543
  head?: never;
1351
1544
  patch?: never;
1352
1545
  trace?: never;
1353
1546
  };
1354
- "/categories/{category}": {
1547
+ "/delivery-notes/{delivery_note}": {
1355
1548
  parameters: {
1356
1549
  query?: never;
1357
1550
  header?: never;
1358
1551
  path?: never;
1359
1552
  cookie?: never;
1360
1553
  };
1361
- /** Display the specified resource */
1362
- get: operations["categories.show"];
1363
- /** Update the specified resource in storage */
1364
- put: operations["categories.update"];
1554
+ /** Show a single delivery note */
1555
+ get: operations["delivery-notes.show"];
1556
+ /** Update a delivery note */
1557
+ put: operations["delivery-notes.update"];
1365
1558
  post?: never;
1366
- /**
1367
- * Borra una categoría de gasto
1368
- * @description Una categoría que todavía tenga gastos NO se borra: la respuesta es un
1369
- * `422` con `error: expense_attached`. Hay que recategorizar esos gastos
1370
- * primero. Un identificador que no existe es un `404`.
1371
- *
1372
- * Los dos casos van en esta prosa y no en el bloque de respuestas porque el
1373
- * `@response` de abajo fija el cuerpo del camino bueno —que es lo que el SDK
1374
- * necesita tipar— y al hacerlo sustituye a lo que el generador dedujera. Sin
1375
- * él, este `200` se publicaba como un objeto opaco.
1376
- */
1377
- delete: operations["categories.destroy"];
1559
+ /** Delete a delivery note */
1560
+ delete: operations["delivery-notes.destroy"];
1378
1561
  options?: never;
1379
1562
  head?: never;
1380
1563
  patch?: never;
1381
1564
  trace?: never;
1382
1565
  };
1383
- "/expenses/{expense}/receipt": {
1566
+ "/employees": {
1384
1567
  parameters: {
1385
1568
  query?: never;
1386
1569
  header?: never;
1387
1570
  path?: never;
1388
1571
  cookie?: never;
1389
1572
  };
1390
- get?: never;
1573
+ get: operations["employees.index"];
1391
1574
  put?: never;
1392
- /**
1393
- * Sube o reemplaza el justificante de un gasto
1575
+ post: operations["employees.store"];
1576
+ delete?: never;
1577
+ options?: never;
1578
+ head?: never;
1579
+ patch?: never;
1580
+ trace?: never;
1581
+ };
1582
+ "/employees/{employee}": {
1583
+ parameters: {
1584
+ query?: never;
1585
+ header?: never;
1586
+ path?: never;
1587
+ cookie?: never;
1588
+ };
1589
+ get: operations["employees.show"];
1590
+ put: operations["employees.update"];
1591
+ post?: never;
1592
+ delete: operations["employees.destroy"];
1593
+ options?: never;
1594
+ head?: never;
1595
+ patch?: never;
1596
+ trace?: never;
1597
+ };
1598
+ "/estimates/pdf/{estimate}": {
1599
+ parameters: {
1600
+ query?: never;
1601
+ header?: never;
1602
+ path?: never;
1603
+ cookie?: never;
1604
+ };
1605
+ /** Handle the incoming request */
1606
+ get: operations["pdf.estimatePdf"];
1607
+ put?: never;
1608
+ post?: never;
1609
+ delete?: never;
1610
+ options?: never;
1611
+ head?: never;
1612
+ patch?: never;
1613
+ trace?: never;
1614
+ };
1615
+ "/estimate-series": {
1616
+ parameters: {
1617
+ query?: never;
1618
+ header?: never;
1619
+ path?: never;
1620
+ cookie?: never;
1621
+ };
1622
+ get: operations["estimate-series.index"];
1623
+ put?: never;
1624
+ post: operations["estimate-series.store"];
1625
+ delete?: never;
1626
+ options?: never;
1627
+ head?: never;
1628
+ patch?: never;
1629
+ trace?: never;
1630
+ };
1631
+ "/estimate-series/{estimateSeries}": {
1632
+ parameters: {
1633
+ query?: never;
1634
+ header?: never;
1635
+ path?: never;
1636
+ cookie?: never;
1637
+ };
1638
+ get: operations["estimate-series.show"];
1639
+ put: operations["estimate-series.update"];
1640
+ post?: never;
1641
+ /**
1642
+ * Baja lógica, nunca borrado: los presupuestos ya numerados con la serie
1643
+ * siguen apuntándola y su `estimates_count` es lo que explica por qué el
1644
+ * contador va por donde va
1645
+ */
1646
+ delete: operations["estimate-series.destroy"];
1647
+ options?: never;
1648
+ head?: never;
1649
+ patch?: never;
1650
+ trace?: never;
1651
+ };
1652
+ "/estimates/templates": {
1653
+ parameters: {
1654
+ query?: never;
1655
+ header?: never;
1656
+ path?: never;
1657
+ cookie?: never;
1658
+ };
1659
+ /**
1660
+ * Galería de diseños base de presupuesto
1661
+ * @description Un elemento por diseño. `path` es la URL pública de su miniatura (un
1662
+ * recurso estático del producto, igual para todas las instancias y
1663
+ * cacheable), o `''` si el diseño no tiene miniatura. Hasta el #415 venía
1664
+ * incrustada en base64 y la respuesta pesaba más de un megabyte.
1665
+ */
1666
+ get: operations["estimate.estimateTemplates"];
1667
+ put?: never;
1668
+ post?: never;
1669
+ delete?: never;
1670
+ options?: never;
1671
+ head?: never;
1672
+ patch?: never;
1673
+ trace?: never;
1674
+ };
1675
+ "/estimates/delete": {
1676
+ parameters: {
1677
+ query?: never;
1678
+ header?: never;
1679
+ path?: never;
1680
+ cookie?: never;
1681
+ };
1682
+ get?: never;
1683
+ put?: never;
1684
+ post: operations["estimates.delete"];
1685
+ delete?: never;
1686
+ options?: never;
1687
+ head?: never;
1688
+ patch?: never;
1689
+ trace?: never;
1690
+ };
1691
+ "/estimates": {
1692
+ parameters: {
1693
+ query?: never;
1694
+ header?: never;
1695
+ path?: never;
1696
+ cookie?: never;
1697
+ };
1698
+ get: operations["estimates.index"];
1699
+ put?: never;
1700
+ post: operations["estimates.store"];
1701
+ delete?: never;
1702
+ options?: never;
1703
+ head?: never;
1704
+ patch?: never;
1705
+ trace?: never;
1706
+ };
1707
+ "/estimates/{estimate}": {
1708
+ parameters: {
1709
+ query?: never;
1710
+ header?: never;
1711
+ path?: never;
1712
+ cookie?: never;
1713
+ };
1714
+ get: operations["estimates.show"];
1715
+ put: operations["estimates.update"];
1716
+ post?: never;
1717
+ delete?: never;
1718
+ options?: never;
1719
+ head?: never;
1720
+ patch?: never;
1721
+ trace?: never;
1722
+ };
1723
+ "/categories": {
1724
+ parameters: {
1725
+ query?: never;
1726
+ header?: never;
1727
+ path?: never;
1728
+ cookie?: never;
1729
+ };
1730
+ /** Display a listing of the resource */
1731
+ get: operations["categories.index"];
1732
+ put?: never;
1733
+ /** Store a newly created resource in storage */
1734
+ post: operations["categories.store"];
1735
+ delete?: never;
1736
+ options?: never;
1737
+ head?: never;
1738
+ patch?: never;
1739
+ trace?: never;
1740
+ };
1741
+ "/categories/{category}": {
1742
+ parameters: {
1743
+ query?: never;
1744
+ header?: never;
1745
+ path?: never;
1746
+ cookie?: never;
1747
+ };
1748
+ /** Display the specified resource */
1749
+ get: operations["categories.show"];
1750
+ /** Update the specified resource in storage */
1751
+ put: operations["categories.update"];
1752
+ post?: never;
1753
+ /**
1754
+ * Borra una categoría de gasto
1755
+ * @description Una categoría que todavía tenga gastos NO se borra: la respuesta es un
1756
+ * `422` con `error: expense_attached`. Hay que recategorizar esos gastos
1757
+ * primero. Un identificador que no existe es un `404`.
1758
+ *
1759
+ * Los dos casos van en esta prosa y no en el bloque de respuestas porque el
1760
+ * `@response` de abajo fija el cuerpo del camino bueno —que es lo que el SDK
1761
+ * necesita tipar— y al hacerlo sustituye a lo que el generador dedujera. Sin
1762
+ * él, este `200` se publicaba como un objeto opaco.
1763
+ */
1764
+ delete: operations["categories.destroy"];
1765
+ options?: never;
1766
+ head?: never;
1767
+ patch?: never;
1768
+ trace?: never;
1769
+ };
1770
+ "/expenses/{expense}/receipt": {
1771
+ parameters: {
1772
+ query?: never;
1773
+ header?: never;
1774
+ path?: never;
1775
+ cookie?: never;
1776
+ };
1777
+ get?: never;
1778
+ put?: never;
1779
+ /**
1780
+ * Sube o reemplaza el justificante de un gasto
1394
1781
  * @description Es la mitad que faltaba: hasta aquí, adjuntar un papel a un gasto que ya
1395
1782
  * existe **no se podía hacer desde ningún cliente del contrato**. El `PUT`
1396
1783
  * lo publicaba como multiparte y no puede cumplirlo (ver `update()`), y el
@@ -1610,7 +1997,7 @@ export interface paths {
1610
1997
  patch?: never;
1611
1998
  trace?: never;
1612
1999
  };
1613
- "/currencies/used": {
2000
+ "/gestoria-link/asesorias": {
1614
2001
  parameters: {
1615
2002
  query?: never;
1616
2003
  header?: never;
@@ -1618,10 +2005,11 @@ export interface paths {
1618
2005
  cookie?: never;
1619
2006
  };
1620
2007
  /**
1621
- * Handle the incoming request
1622
- * @description **Catálogo `meta`.** Lectura libre: la alcanza cualquier token válido, sin scope y sin consentimiento adicional del dueño del tenant.
2008
+ * List available advisory firms for tenant users to browse.
2009
+ * Searches across users table AND gestoria_settings (nombre_despacho, nif_despacho, email_despacho)
2010
+ * @description **Reservada al panel de Pimia.** Exige `admin:read`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
1623
2011
  */
1624
- get: operations["general.getAllUsedCurrencies"];
2012
+ get: operations["gestoriaLink.asesorias"];
1625
2013
  put?: never;
1626
2014
  post?: never;
1627
2015
  delete?: never;
@@ -1630,68 +2018,142 @@ export interface paths {
1630
2018
  patch?: never;
1631
2019
  trace?: never;
1632
2020
  };
1633
- "/company/settings": {
2021
+ "/gestoria-link/status": {
1634
2022
  parameters: {
1635
2023
  query?: never;
1636
2024
  header?: never;
1637
2025
  path?: never;
1638
2026
  cookie?: never;
1639
2027
  };
1640
- /** Handle the incoming request */
1641
- get: operations["settings.getCompanySettings"];
2028
+ /** @description **Reservada al panel de Pimia.** Exige `admin:read`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí. */
2029
+ get: operations["gestoriaLink.status"];
1642
2030
  put?: never;
1643
- /** Handle the incoming request */
1644
- post: operations["settings.updateCompanySettings"];
2031
+ post?: never;
1645
2032
  delete?: never;
1646
2033
  options?: never;
1647
2034
  head?: never;
1648
2035
  patch?: never;
1649
2036
  trace?: never;
1650
2037
  };
1651
- "/currencies/{currency}/exchange-rate": {
2038
+ "/gestoria-link/request": {
1652
2039
  parameters: {
1653
2040
  query?: never;
1654
2041
  header?: never;
1655
2042
  path?: never;
1656
2043
  cookie?: never;
1657
2044
  };
2045
+ get?: never;
2046
+ put?: never;
1658
2047
  /**
1659
- * El último tipo de cambio conocido de esta moneda contra la de la empresa
1660
- * @description **Catálogo `meta`.** Lectura libre: la alcanza cualquier token válido, sin scope y sin consentimiento adicional del dueño del tenant.
1661
- *
1662
- * ⚠️ **Las dos ramas responden `200`.** Cuando hay cambio registrado viene
1663
- * `exchangeRate`, un array de un solo elemento (así lo consume
1664
- * `ExchangeRateConverter.vue`); cuando no hay ninguno viene
1665
- * `error: no_exchange_rate_available` — con `200`, no con `404`. Quien
1666
- * llame tiene que mirar QUÉ clave llegó, no el código de estado.
1667
- *
1668
- * Una moneda que no existe sí es un `404`, y también la empresa sin ajuste
1669
- * `currency`. Eso va en esta prosa porque el `@response` de abajo sustituye
1670
- * a lo que el generador dedujera; sin él, este `200` se publicaba como un
1671
- * objeto opaco.
2048
+ * Request linkage: accepts gestoria_id (select from list) or link_code (manual code)
2049
+ * @description **Reservada al panel de Pimia.** Exige `admin:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
1672
2050
  */
1673
- get: operations["exchangeRate.getExchangeRate"];
1674
- put?: never;
1675
- post?: never;
2051
+ post: operations["gestoriaLink.request"];
1676
2052
  delete?: never;
1677
2053
  options?: never;
1678
2054
  head?: never;
1679
2055
  patch?: never;
1680
2056
  trace?: never;
1681
2057
  };
1682
- "/settings": {
2058
+ "/gestoria-link/revoke": {
1683
2059
  parameters: {
1684
2060
  query?: never;
1685
2061
  header?: never;
1686
2062
  path?: never;
1687
2063
  cookie?: never;
1688
2064
  };
1689
- /** Handle the incoming request */
1690
- get: operations["settings.getSettings"];
2065
+ get?: never;
1691
2066
  put?: never;
2067
+ post?: never;
2068
+ /** @description **Reservada al panel de Pimia.** Exige `admin:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí. */
2069
+ delete: operations["gestoriaLink.revoke"];
2070
+ options?: never;
2071
+ head?: never;
2072
+ patch?: never;
2073
+ trace?: never;
2074
+ };
2075
+ "/currencies/used": {
2076
+ parameters: {
2077
+ query?: never;
2078
+ header?: never;
2079
+ path?: never;
2080
+ cookie?: never;
2081
+ };
1692
2082
  /**
1693
- * Escribe ajustes de la INSTANCIA (no de la empresa)
1694
- * @description Un token cuyo scope gobierne esta escritura no puede tocar las claves de
2083
+ * Handle the incoming request
2084
+ * @description **Catálogo `meta`.** Lectura libre: la alcanza cualquier token válido, sin scope y sin consentimiento adicional del dueño del tenant.
2085
+ */
2086
+ get: operations["general.getAllUsedCurrencies"];
2087
+ put?: never;
2088
+ post?: never;
2089
+ delete?: never;
2090
+ options?: never;
2091
+ head?: never;
2092
+ patch?: never;
2093
+ trace?: never;
2094
+ };
2095
+ "/company/settings": {
2096
+ parameters: {
2097
+ query?: never;
2098
+ header?: never;
2099
+ path?: never;
2100
+ cookie?: never;
2101
+ };
2102
+ /** Handle the incoming request */
2103
+ get: operations["settings.getCompanySettings"];
2104
+ put?: never;
2105
+ /** Handle the incoming request */
2106
+ post: operations["settings.updateCompanySettings"];
2107
+ delete?: never;
2108
+ options?: never;
2109
+ head?: never;
2110
+ patch?: never;
2111
+ trace?: never;
2112
+ };
2113
+ "/currencies/{currency}/exchange-rate": {
2114
+ parameters: {
2115
+ query?: never;
2116
+ header?: never;
2117
+ path?: never;
2118
+ cookie?: never;
2119
+ };
2120
+ /**
2121
+ * El último tipo de cambio conocido de esta moneda contra la de la empresa
2122
+ * @description **Catálogo `meta`.** Lectura libre: la alcanza cualquier token válido, sin scope y sin consentimiento adicional del dueño del tenant.
2123
+ *
2124
+ * ⚠️ **Las dos ramas responden `200`.** Cuando hay cambio registrado viene
2125
+ * `exchangeRate`, un array de un solo elemento (así lo consume
2126
+ * `ExchangeRateConverter.vue`); cuando no hay ninguno viene
2127
+ * `error: no_exchange_rate_available` — con `200`, no con `404`. Quien
2128
+ * llame tiene que mirar QUÉ clave llegó, no el código de estado.
2129
+ *
2130
+ * Una moneda que no existe sí es un `404`, y también la empresa sin ajuste
2131
+ * `currency`. Eso va en esta prosa porque el `@response` de abajo sustituye
2132
+ * a lo que el generador dedujera; sin él, este `200` se publicaba como un
2133
+ * objeto opaco.
2134
+ */
2135
+ get: operations["exchangeRate.getExchangeRate"];
2136
+ put?: never;
2137
+ post?: never;
2138
+ delete?: never;
2139
+ options?: never;
2140
+ head?: never;
2141
+ patch?: never;
2142
+ trace?: never;
2143
+ };
2144
+ "/settings": {
2145
+ parameters: {
2146
+ query?: never;
2147
+ header?: never;
2148
+ path?: never;
2149
+ cookie?: never;
2150
+ };
2151
+ /** Handle the incoming request */
2152
+ get: operations["settings.getSettings"];
2153
+ put?: never;
2154
+ /**
2155
+ * Escribe ajustes de la INSTANCIA (no de la empresa)
2156
+ * @description Un token cuyo scope gobierne esta escritura no puede tocar las claves de
1695
2157
  * credencial: si el cuerpo trae alguna, la respuesta es un `422` con
1696
2158
  * `success: false` y un `message` que las nombra, y **no se escribe
1697
2159
  * ninguna** (ver {@see \App\Support\SensitiveSettingKeys}). Ese caso va en
@@ -2319,7 +2781,12 @@ export interface paths {
2319
2781
  path?: never;
2320
2782
  cookie?: never;
2321
2783
  };
2322
- /** Retrieve a list of existing Items */
2784
+ /**
2785
+ * Retrieve a list of existing Items
2786
+ * @description El `@return` de JsonResponse se retira como en el índice de facturas:
2787
+ * nunca fue el tipo real y, con dos returns, dejaba la respuesta sin forma
2788
+ * en el spec.
2789
+ */
2323
2790
  get: operations["items.index"];
2324
2791
  put?: never;
2325
2792
  /** Create Item */
@@ -3583,6 +4050,22 @@ export interface paths {
3583
4050
  patch?: never;
3584
4051
  trace?: never;
3585
4052
  };
4053
+ "/contracts/{contract}/renew": {
4054
+ parameters: {
4055
+ query?: never;
4056
+ header?: never;
4057
+ path?: never;
4058
+ cookie?: never;
4059
+ };
4060
+ get?: never;
4061
+ put?: never;
4062
+ post: operations["contract.renewContract"];
4063
+ delete?: never;
4064
+ options?: never;
4065
+ head?: never;
4066
+ patch?: never;
4067
+ trace?: never;
4068
+ };
3586
4069
  "/roles/{role}/abilities": {
3587
4070
  parameters: {
3588
4071
  query?: never;
@@ -3920,6 +4403,54 @@ export interface paths {
3920
4403
  patch?: never;
3921
4404
  trace?: never;
3922
4405
  };
4406
+ "/invoices/{invoice}/shared-link": {
4407
+ parameters: {
4408
+ query?: never;
4409
+ header?: never;
4410
+ path?: never;
4411
+ cookie?: never;
4412
+ };
4413
+ get: operations["invoice.sharedLink"];
4414
+ put?: never;
4415
+ post?: never;
4416
+ delete?: never;
4417
+ options?: never;
4418
+ head?: never;
4419
+ patch?: never;
4420
+ trace?: never;
4421
+ };
4422
+ "/contracts/{contract}/shared-link": {
4423
+ parameters: {
4424
+ query?: never;
4425
+ header?: never;
4426
+ path?: never;
4427
+ cookie?: never;
4428
+ };
4429
+ get: operations["contract.sharedLink"];
4430
+ put?: never;
4431
+ post?: never;
4432
+ delete?: never;
4433
+ options?: never;
4434
+ head?: never;
4435
+ patch?: never;
4436
+ trace?: never;
4437
+ };
4438
+ "/estimates/{estimate}/shared-link": {
4439
+ parameters: {
4440
+ query?: never;
4441
+ header?: never;
4442
+ path?: never;
4443
+ cookie?: never;
4444
+ };
4445
+ get: operations["estimate.sharedLink"];
4446
+ put?: never;
4447
+ post?: never;
4448
+ delete?: never;
4449
+ options?: never;
4450
+ head?: never;
4451
+ patch?: never;
4452
+ trace?: never;
4453
+ };
3923
4454
  "/expenses/{expense}/show/receipt": {
3924
4455
  parameters: {
3925
4456
  query?: never;
@@ -4316,6 +4847,144 @@ export interface paths {
4316
4847
  patch?: never;
4317
4848
  trace?: never;
4318
4849
  };
4850
+ "/delegated-tasks": {
4851
+ parameters: {
4852
+ query?: never;
4853
+ header?: never;
4854
+ path?: never;
4855
+ cookie?: never;
4856
+ };
4857
+ /**
4858
+ * El poll del agente: sus tareas delegadas y aún sin resolver
4859
+ * @description **Reservada al panel de Pimia.** Exige `delegation:read`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
4860
+ *
4861
+ * Solo tareas del propio tenant que estén `pending` o `in_progress`. Cada
4862
+ * una viaja con su señal de autonomía —`write_effect`, `default_mode` y
4863
+ * `verifiability_level`—, que es lo que le dice al agente si puede aplicar
4864
+ * directamente o tiene que proponer y esperar aprobación.
4865
+ */
4866
+ get: operations["tenantDelegationCallback.delegatedIndex"];
4867
+ put?: never;
4868
+ post?: never;
4869
+ delete?: never;
4870
+ options?: never;
4871
+ head?: never;
4872
+ patch?: never;
4873
+ trace?: never;
4874
+ };
4875
+ "/delegated-tasks/{id}/claim": {
4876
+ parameters: {
4877
+ query?: never;
4878
+ header?: never;
4879
+ path?: never;
4880
+ cookie?: never;
4881
+ };
4882
+ get?: never;
4883
+ put?: never;
4884
+ /**
4885
+ * El agente RECLAMA una tarea pendiente y la pone en curso
4886
+ * @description **Reservada al panel de Pimia.** Exige `delegation:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
4887
+ *
4888
+ * Idempotente: reclamar una que ya se tenía devuelve la misma tarea sin
4889
+ * efecto. Una ya resuelta no se re-reclama (`409`), y una que no es del
4890
+ * propio tenant no existe (`404`).
4891
+ */
4892
+ post: operations["tenantDelegationCallback.taskClaim"];
4893
+ delete?: never;
4894
+ options?: never;
4895
+ head?: never;
4896
+ patch?: never;
4897
+ trace?: never;
4898
+ };
4899
+ "/delegated-tasks/{id}/propose": {
4900
+ parameters: {
4901
+ query?: never;
4902
+ header?: never;
4903
+ path?: never;
4904
+ cookie?: never;
4905
+ };
4906
+ get?: never;
4907
+ put?: never;
4908
+ /**
4909
+ * El agente PROPONE un borrador reversible en vez de aplicarlo
4910
+ * @description **Reservada al panel de Pimia.** Exige `delegation:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
4911
+ *
4912
+ * Preview-antes-de-aplicar: para lo que muta datos, el agente no escribe —
4913
+ * manda su propuesta (`summary`, `changes[]`, `evals[]`), la tarea sigue en
4914
+ * curso y el dueño decide. Es el checkpoint reversible.
4915
+ *
4916
+ * `409` si la propuesta ya fue aprobada: esa decisión no se pisa con un
4917
+ * re-propose que llega tarde. `422` si la tarea no admite propuesta porque
4918
+ * ya corre en modo autónomo — ahí lo que toca es `complete`.
4919
+ *
4920
+ * El sello de verifiabilidad lo deriva el servidor de los `evals`; el que
4921
+ * venga en el cuerpo se reemplaza.
4922
+ */
4923
+ post: operations["tenantDelegationCallback.taskPropose"];
4924
+ delete?: never;
4925
+ options?: never;
4926
+ head?: never;
4927
+ patch?: never;
4928
+ trace?: never;
4929
+ };
4930
+ "/delegated-tasks/{id}/complete": {
4931
+ parameters: {
4932
+ query?: never;
4933
+ header?: never;
4934
+ path?: never;
4935
+ cookie?: never;
4936
+ };
4937
+ get?: never;
4938
+ put?: never;
4939
+ /**
4940
+ * El agente reporta la tarea COMPLETADA, con un resultado verificable
4941
+ * @description **Reservada al panel de Pimia.** Exige `delegation:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
4942
+ *
4943
+ * Acepta el `result_data` estructurado (preferido) y/o un `result` en prosa;
4944
+ * al menos uno es obligatorio. Idempotente sobre una tarea ya completada.
4945
+ *
4946
+ * Lo que puede cerrarse directo depende del modo: en modo autónomo sí, y en
4947
+ * modo `preview` hace falta una propuesta aprobada — el agente no se salta
4948
+ * su propio checkpoint (`409`, con `code: proposal_required`).
4949
+ *
4950
+ * ⚠️ Reportar «completada» no basta para quedar aplicada. Si la tarea
4951
+ * reclama escrituras, el reporte tiene que traer evidencia —sello `pass`
4952
+ * derivado de los `evals`—: un reporte que declara fallo, o que llega sin
4953
+ * esa evidencia, cierra la tarea como `failed`. `applied_at` afirma que las
4954
+ * escrituras aprobadas ocurrieron, así que no se presume del visto bueno.
4955
+ */
4956
+ post: operations["tenantDelegationCallback.taskComplete"];
4957
+ delete?: never;
4958
+ options?: never;
4959
+ head?: never;
4960
+ patch?: never;
4961
+ trace?: never;
4962
+ };
4963
+ "/delegated-tasks/{id}/fail": {
4964
+ parameters: {
4965
+ query?: never;
4966
+ header?: never;
4967
+ path?: never;
4968
+ cookie?: never;
4969
+ };
4970
+ get?: never;
4971
+ put?: never;
4972
+ /**
4973
+ * El agente reporta la tarea FALLIDA
4974
+ * @description **Reservada al panel de Pimia.** Exige `delegation:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
4975
+ *
4976
+ * Igual que al completar, hace falta al menos `result` (prosa) o
4977
+ * `result_data` (estructurado): una tarea fallida también lleva su sello
4978
+ * derivado por el servidor, para que el panel pinte los `evals` honestos y
4979
+ * no lo que el agente diga de sí mismo.
4980
+ */
4981
+ post: operations["tenantDelegationCallback.taskFail"];
4982
+ delete?: never;
4983
+ options?: never;
4984
+ head?: never;
4985
+ patch?: never;
4986
+ trace?: never;
4987
+ };
4319
4988
  "/tenant-modules": {
4320
4989
  parameters: {
4321
4990
  query?: never;
@@ -4895,23 +5564,54 @@ export interface paths {
4895
5564
  patch?: never;
4896
5565
  trace?: never;
4897
5566
  };
4898
- "/settings/webhooks": {
5567
+ "/settings/verifactu": {
4899
5568
  parameters: {
4900
5569
  query?: never;
4901
5570
  header?: never;
4902
5571
  path?: never;
4903
5572
  cookie?: never;
4904
5573
  };
4905
- get: operations["webhookEndpoints.index"];
4906
- put?: never;
4907
- post: operations["webhookEndpoints.store"];
5574
+ /**
5575
+ * Get the current VeriFactu configuration (taxpayer data)
5576
+ * @description **Reservada al panel de Pimia.** Exige `verifactu:read`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
5577
+ *
5578
+ * LEE Y NADA MÁS. Hasta 2026-08-22 este GET creaba el contribuyente en
5579
+ * VeriFactu si no existía: `resolveTaxpayer` intentaba SIEMPRE el
5580
+ * `createTaxpayer` y además escribía `verifactu_taxpayer_id` en el tenant.
5581
+ * O sea que abrir la pantalla de ajustes daba de alta a la empresa ante un
5582
+ * tercero, y un `GET` repetido por un monitor o un prefetch la daba de alta
5583
+ * sola. Un GET que registra a la empresa en la AEAT no es una lectura.
5584
+ *
5585
+ * Quien quiera crearlo lo pide explícitamente: `PUT /settings/verifactu`
5586
+ * (guardar la configuración, que es lo que hace el panel) o el
5587
+ * `POST /settings/verifactu/taxpayer` de abajo. Mientras no exista, esto
5588
+ * devuelve el payload vacío, que ya distingue el caso con
5589
+ * `authorization_status = 'none'`.
5590
+ */
5591
+ get: operations["veriFactuSettings.index"];
5592
+ /**
5593
+ * Update VeriFactu settings (environment, representative mode)
5594
+ * @description **Reservada al panel de Pimia.** Exige `verifactu:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
5595
+ *
5596
+ * Si hay taxpayer en VeriFactu, actualiza via API. Si el tenant aún no
5597
+ * tiene credencial, o faltan los datos para crear el contribuyente, guarda
5598
+ * en local para cuando se configure — ese es el único caso en que «guardado
5599
+ * localmente» es verdad y no un fallo disfrazado.
5600
+ *
5601
+ * Hasta 2026-08-27 CUALQUIER excepción caía al guardado local y contestaba
5602
+ * 200 «Configuración guardada localmente»: con VeriFactu caído, el
5603
+ * formulario decía «guardado» sobre un `is_production` que no llegó a donde
5604
+ * importa. Ahora un fallo de la API remota contesta 502 con el error.
5605
+ */
5606
+ put: operations["veriFactuSettings.update"];
5607
+ post?: never;
4908
5608
  delete?: never;
4909
5609
  options?: never;
4910
5610
  head?: never;
4911
5611
  patch?: never;
4912
5612
  trace?: never;
4913
5613
  };
4914
- "/settings/webhooks/{id}": {
5614
+ "/settings/verifactu/taxpayer": {
4915
5615
  parameters: {
4916
5616
  query?: never;
4917
5617
  header?: never;
@@ -4920,43 +5620,104 @@ export interface paths {
4920
5620
  };
4921
5621
  get?: never;
4922
5622
  put?: never;
4923
- post?: never;
4924
- delete: operations["webhookEndpoints.destroy"];
5623
+ /**
5624
+ * Alta explícita del contribuyente en VeriFactu
5625
+ * @description **Reservada al panel de Pimia.** Exige `verifactu:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
5626
+ *
5627
+ * Es el POST que se lleva el efecto que tenía el GET. Si ya existe, lo
5628
+ * devuelve sin crear nada (idempotente); si faltan el NIF o el nombre de la
5629
+ * empresa responde 422 diciéndolo, en vez de dejar un aviso en el log y
5630
+ * devolver un payload vacío que no explica por qué está vacío.
5631
+ */
5632
+ post: operations["veriFactuSettings.storeTaxpayer"];
5633
+ delete?: never;
4925
5634
  options?: never;
4926
5635
  head?: never;
4927
5636
  patch?: never;
4928
5637
  trace?: never;
4929
5638
  };
4930
- "/settings/webhooks/{id}/deliveries": {
5639
+ "/settings/verifactu/certificate": {
4931
5640
  parameters: {
4932
5641
  query?: never;
4933
5642
  header?: never;
4934
5643
  path?: never;
4935
5644
  cookie?: never;
4936
5645
  };
4937
- get: operations["webhookEndpoints.deliveries"];
5646
+ get?: never;
4938
5647
  put?: never;
4939
- post?: never;
5648
+ /**
5649
+ * Upload a .pfx/.p12 certificate to VeriFactu
5650
+ * @description **Reservada al panel de Pimia.** Exige `verifactu:write`, que el Authorization Server emite SOLO al client de primera parte: un client de integrador no puede pedir ese scope —se le rechaza en el registro y no se le anuncia— y con cualquier otro token la llamada recibe `403`. Está en el contrato porque es el panel web de Pimia quien la consume, y sus tipos salen de aquí.
5651
+ */
5652
+ post: operations["veriFactuSettings.uploadCertificate"];
4940
5653
  delete?: never;
4941
5654
  options?: never;
4942
5655
  head?: never;
4943
5656
  patch?: never;
4944
5657
  trace?: never;
4945
5658
  };
4946
- "/settings/webhooks/deliveries/{id}/replay": {
5659
+ "/settings/webhooks": {
4947
5660
  parameters: {
4948
5661
  query?: never;
4949
5662
  header?: never;
4950
5663
  path?: never;
4951
5664
  cookie?: never;
4952
5665
  };
4953
- get?: never;
5666
+ get: operations["webhookEndpoints.index"];
4954
5667
  put?: never;
4955
- /**
4956
- * Re-encola una entrega dead|failed dentro de la ventana de replay. La
4957
- * fila vuelve a pending con los contadores a cero (conserva su id → el
4958
- * receptor la deduplica por X-Pimia-Delivery si ya la procesó)
4959
- */
5668
+ post: operations["webhookEndpoints.store"];
5669
+ delete?: never;
5670
+ options?: never;
5671
+ head?: never;
5672
+ patch?: never;
5673
+ trace?: never;
5674
+ };
5675
+ "/settings/webhooks/{id}": {
5676
+ parameters: {
5677
+ query?: never;
5678
+ header?: never;
5679
+ path?: never;
5680
+ cookie?: never;
5681
+ };
5682
+ get?: never;
5683
+ put?: never;
5684
+ post?: never;
5685
+ delete: operations["webhookEndpoints.destroy"];
5686
+ options?: never;
5687
+ head?: never;
5688
+ patch?: never;
5689
+ trace?: never;
5690
+ };
5691
+ "/settings/webhooks/{id}/deliveries": {
5692
+ parameters: {
5693
+ query?: never;
5694
+ header?: never;
5695
+ path?: never;
5696
+ cookie?: never;
5697
+ };
5698
+ get: operations["webhookEndpoints.deliveries"];
5699
+ put?: never;
5700
+ post?: never;
5701
+ delete?: never;
5702
+ options?: never;
5703
+ head?: never;
5704
+ patch?: never;
5705
+ trace?: never;
5706
+ };
5707
+ "/settings/webhooks/deliveries/{id}/replay": {
5708
+ parameters: {
5709
+ query?: never;
5710
+ header?: never;
5711
+ path?: never;
5712
+ cookie?: never;
5713
+ };
5714
+ get?: never;
5715
+ put?: never;
5716
+ /**
5717
+ * Re-encola una entrega dead|failed dentro de la ventana de replay. La
5718
+ * fila vuelve a pending con los contadores a cero (conserva su id → el
5719
+ * receptor la deduplica por X-Pimia-Delivery si ya la procesó)
5720
+ */
4960
5721
  post: operations["webhookEndpoints.replay"];
4961
5722
  delete?: never;
4962
5723
  options?: never;
@@ -5123,6 +5884,23 @@ export interface components {
5123
5884
  name: string;
5124
5885
  } | null;
5125
5886
  };
5887
+ /**
5888
+ * ActivateContractRequest
5889
+ * @description Activación de un contrato (`POST /contracts/{contract}/activate`).
5890
+ *
5891
+ * Sin cuerpo, el contrato CREA su recurrente gobernada; con
5892
+ * `recurring_invoice_id`, ADOPTA esa — heredándole los límites del periodo
5893
+ * pero sin pisar su frecuencia, sus líneas ni sus impuestos, que son
5894
+ * configuración humana (Contract::activate()).
5895
+ *
5896
+ * El `exists` va acotado por empresa por la misma lección de siempre (#395):
5897
+ * dentro de una instancia conviven varias empresas, y el id a secas casaría
5898
+ * la recurrente de otra. El modelo lo re-comprueba (empresa Y cliente), pero
5899
+ * el 422 de aquí llega antes y dice qué falla.
5900
+ */
5901
+ ActivateContractRequest: {
5902
+ recurring_invoice_id?: number | null;
5903
+ };
5126
5904
  /** AddressResource */
5127
5905
  AddressResource: {
5128
5906
  id: number;
@@ -5368,6 +6146,102 @@ export interface components {
5368
6146
  /** Format: date-time */
5369
6147
  updated_at: string | null;
5370
6148
  };
6149
+ /**
6150
+ * ContractRequest
6151
+ * @description Alta y edición de un contrato (`POST /contracts`, `PUT /contracts/{id}`).
6152
+ *
6153
+ * Dos decisiones que no son costumbre sino contrato (#583):
6154
+ *
6155
+ * - **`status` NO se acepta aquí.** El ciclo de vida va por sus acciones
6156
+ * (`activate`/`cancel`/`renew`), que son las que gobiernan las recurrentes;
6157
+ * aceptar `status` en el PUT sería un contrato ACTIVE sin recurrente o
6158
+ * CANCELLED sin pausar nada — el estado mentiría. La lista blanca del
6159
+ * payload son estas reglas (ContractFields), así que no declararlo ya es
6160
+ * excluirlo.
6161
+ * - **Los cerrados llevan `Rule::in`**, y no solo por validar: el generador
6162
+ * del spec deduce el enum de la regla, y el estudio dejó medido lo que pasa
6163
+ * cuando no se hace — `frequency`/`status`/`limit_by` de la recurrente son
6164
+ * `string` sin enum en el contrato público y el SDK hereda esa opacidad.
6165
+ */
6166
+ ContractRequest: {
6167
+ title: string;
6168
+ description?: string | null;
6169
+ contract_number?: string | null;
6170
+ customer_id: number;
6171
+ /** Format: date-time */
6172
+ starts_at: string;
6173
+ /**
6174
+ * Format: date-time
6175
+ * @description Nullable = contrato indefinido: la recurrente gobernada hereda
6176
+ * `limit_by = NONE`.
6177
+ */
6178
+ ends_at?: string | null;
6179
+ /**
6180
+ * @description Céntimos, enteros — la convención monetaria de la casa. El tope
6181
+ * es el mismo que el de `total` en documentos.
6182
+ */
6183
+ amount: number;
6184
+ currency_id?: number | null;
6185
+ /** @enum {string} */
6186
+ billing_every: "MONTHLY" | "QUARTERLY" | "SEMIANNUAL" | "ANNUAL";
6187
+ /**
6188
+ * @description 1..31 y no 1..28: el 29-31 es entrada legítima («factúrame a fin
6189
+ * de mes») que la compilación fija al 28 — rechazarla aquí obligaría
6190
+ * al cliente a conocer una limitación de cron que es nuestra.
6191
+ */
6192
+ billing_anchor_day?: number | null;
6193
+ /** @enum {string|null} */
6194
+ renewal_mode?: "NONE" | "MANUAL" | "TACIT" | null;
6195
+ /**
6196
+ * @description Nullable = «usa el default del catálogo regional» (#584). El tope
6197
+ * corta los disparates sin opinar sobre ninguna legislación.
6198
+ */
6199
+ notice_days?: number | null;
6200
+ /**
6201
+ * @description El presupuesto de origen, acotado por empresa — la lección del
6202
+ * `item_id` de las recurrentes (#395): sin el `where`, un contrato
6203
+ * podía quedar apuntando al presupuesto de OTRA empresa del tenant.
6204
+ */
6205
+ estimate_id?: number | null;
6206
+ };
6207
+ /** ContractResource */
6208
+ ContractResource: {
6209
+ id: number;
6210
+ title: string;
6211
+ description: string | null;
6212
+ contract_number: string | null;
6213
+ customer_id: number | null;
6214
+ company_id: number | null;
6215
+ creator_id: number | null;
6216
+ currency_id: number | null;
6217
+ status: string;
6218
+ ha_vencido: boolean;
6219
+ starts_at: string | null;
6220
+ ends_at: string | null;
6221
+ amount: number | null;
6222
+ billing_every: string;
6223
+ billing_anchor_day: number | null;
6224
+ renewal_mode: string;
6225
+ notice_days: number | null;
6226
+ /**
6227
+ * @description El efectivo: el del contrato o el default del catálogo regional
6228
+ * (config/contracts.php). La pantalla enseña este, no el crudo.
6229
+ */
6230
+ notice_days_effective: number;
6231
+ /**
6232
+ * @description ¿Hay firmado adjunto? El fichero se sube por su POST multiparte
6233
+ * dedicado (#584) y se pisa al resubir.
6234
+ */
6235
+ has_document: boolean;
6236
+ estimate_id: number | null;
6237
+ /** Format: date-time */
6238
+ cancelled_at: string | null;
6239
+ fields?: components["schemas"]["CustomFieldValueResource"][];
6240
+ customer?: components["schemas"]["CustomerResource"] | null;
6241
+ estimate?: components["schemas"]["EstimateResource"] | null;
6242
+ recurring_invoices?: components["schemas"]["RecurringInvoiceResource"][];
6243
+ invoices?: components["schemas"]["InvoiceResource"][];
6244
+ };
5371
6245
  /**
5372
6246
  * ConvertEstimateRequest
5373
6247
  * @description Cuerpo —opcional— de la conversión de un presupuesto en factura.
@@ -5710,6 +6584,19 @@ export interface components {
5710
6584
  */
5711
6585
  external_ref: string | null;
5712
6586
  };
6587
+ /**
6588
+ * DeleteContractsRequest
6589
+ * @description Borrado múltiple de contratos (`POST /contracts/delete`). Mismo patrón que
6590
+ * DeleteRecurringInvoicesRequest: el `exists` convierte el id inexistente en
6591
+ * un 422 que dice cuál falla, en vez del 500 de iterar sobre un `find()` nulo.
6592
+ *
6593
+ * Lo que NO valida esto: que cada contrato esté en borrador. Esa es la regla
6594
+ * de negocio (decisión 8: lo activo se cancela, no se borra) y vive en
6595
+ * `Contract::deleteContracts()`, que aborta el lote entero en voz alta.
6596
+ */
6597
+ DeleteContractsRequest: {
6598
+ ids: number[];
6599
+ };
5713
6600
  /** DeleteCustomersRequest */
5714
6601
  DeleteCustomersRequest: {
5715
6602
  ids: number[];
@@ -6495,6 +7382,7 @@ export interface components {
6495
7382
  sent_at: string | null;
6496
7383
  /** Format: date-time */
6497
7384
  viewed_at: string | null;
7385
+ contract_id: number | null;
6498
7386
  };
6499
7387
  /** InvoiceItem */
6500
7388
  InvoiceItem: {
@@ -7033,6 +7921,54 @@ export interface components {
7033
7921
  taxes?: components["schemas"]["TaxResource"][];
7034
7922
  currency?: components["schemas"]["CurrencyResource"] | null;
7035
7923
  };
7924
+ /** ItemSummaryResource */
7925
+ ItemSummaryResource: {
7926
+ id: number;
7927
+ name: string;
7928
+ item_type: string;
7929
+ sku: string | null;
7930
+ supplier_reference: string | null;
7931
+ description: string | null;
7932
+ price: number;
7933
+ purchase_price: number | null;
7934
+ default_discount: number;
7935
+ category_id: number | null;
7936
+ category?: {
7937
+ id: number;
7938
+ name: string;
7939
+ };
7940
+ unit_id: number | null;
7941
+ /**
7942
+ * @description Del `leftJoin` del índice, no de la relación: es el único dato de
7943
+ * la unidad que los listados pintan.
7944
+ */
7945
+ unit_name: string | null;
7946
+ company_id: number | null;
7947
+ currency_id: number | null;
7948
+ tax_per_item: string;
7949
+ purchase_tax_type_id: number | null;
7950
+ is_active: boolean;
7951
+ is_time_trackable: boolean;
7952
+ opening_stock: number;
7953
+ stock_alert_qty: number | null;
7954
+ allow_sale_without_stock: boolean;
7955
+ /** Format: date-time */
7956
+ created_at: string | null;
7957
+ /** Format: date-time */
7958
+ updated_at: string | null;
7959
+ taxes?: {
7960
+ id: number;
7961
+ tax_type_id: number | null;
7962
+ item_id: number | null;
7963
+ company_id: number | null;
7964
+ name: string;
7965
+ amount: number;
7966
+ percent: number;
7967
+ base_amount: number;
7968
+ currency_id: number | null;
7969
+ type: string | null;
7970
+ }[];
7971
+ };
7036
7972
  /** ItemsRequest */
7037
7973
  ItemsRequest: {
7038
7974
  name: string;
@@ -7763,6 +8699,18 @@ export interface components {
7763
8699
  creator?: components["schemas"]["UserResource"] | null;
7764
8700
  currency?: components["schemas"]["CurrencyResource"] | null;
7765
8701
  };
8702
+ /**
8703
+ * RenewContractRequest
8704
+ * @description Renovación manual de un contrato (`POST /contracts/{contract}/renew`).
8705
+ *
8706
+ * Solo la fecha nueva: que sea POSTERIOR al fin actual —renovar es extender—
8707
+ * lo comprueba `Contract::renew()`, porque depende del estado del contrato y
8708
+ * no del cuerpo. La renovación tácita no pasa por aquí: es el job de fase 2.
8709
+ */
8710
+ RenewContractRequest: {
8711
+ /** Format: date-time */
8712
+ ends_at: string;
8713
+ };
7766
8714
  /** Role */
7767
8715
  Role: {
7768
8716
  id: number;
@@ -7803,7 +8751,7 @@ export interface components {
7803
8751
  * ningún permiso es una operación legítima, y `required` la
7804
8752
  * prohibiría (un array vacío no pasa `required`).
7805
8753
  */
7806
- abilities: ("dashboard" | "view-customer" | "create-customer" | "edit-customer" | "delete-customer" | "view-estimate" | "create-estimate" | "edit-estimate" | "delete-estimate" | "send-estimate" | "view-invoice" | "create-invoice" | "edit-invoice" | "delete-invoice" | "send-invoice" | "view-recurring-invoice" | "create-recurring-invoice" | "edit-recurring-invoice" | "delete-recurring-invoice" | "view-payment" | "create-payment" | "edit-payment" | "delete-payment" | "send-payment" | "view-expense" | "create-expense" | "edit-expense" | "delete-expense" | "view-delivery-note" | "create-delivery-note" | "edit-delivery-note" | "delete-delivery-note" | "view-item" | "create-item" | "edit-item" | "delete-item" | "view-lead" | "create-lead" | "edit-lead" | "delete-lead" | "convert-lead" | "view-contact" | "create-contact" | "edit-contact" | "delete-contact" | "view-project" | "create-project" | "edit-project" | "delete-project" | "view-task" | "create-task" | "edit-task" | "delete-task" | "view-own-task" | "edit-own-task" | "view-time-entry" | "create-time-entry" | "edit-time-entry" | "delete-time-entry" | "view-own-time-entry" | "create-own-time-entry" | "edit-own-time-entry" | "delete-own-time-entry" | "view-tax-type" | "create-tax-type" | "edit-tax-type" | "delete-tax-type" | "view-custom-field" | "create-custom-field" | "edit-custom-field" | "delete-custom-field" | "view-role" | "create-role" | "edit-role" | "delete-role" | "view-financial-reports" | "view-all-notes" | "manage-all-notes" | "time_clock.punch" | "time_clock.view_own" | "time_clock.view_team" | "time_clock.correct" | "absence.request" | "absence.approve" | "report.download_legal" | "view-employee" | "create-employee" | "edit-employee" | "delete-employee" | "view-work-schedule" | "manage-work-schedule" | "view-work-calendar" | "manage-work-calendar" | "pos.operate" | "pos.supervise" | "pos.void" | "pos.discount_high" | "pos.cash_movement" | "pos.return" | "pos.admin" | "pos.report" | "view-appointment" | "create-appointment" | "edit-appointment" | "delete-appointment")[];
8754
+ abilities: ("dashboard" | "view-customer" | "create-customer" | "edit-customer" | "delete-customer" | "view-estimate" | "create-estimate" | "edit-estimate" | "delete-estimate" | "send-estimate" | "view-invoice" | "create-invoice" | "edit-invoice" | "delete-invoice" | "send-invoice" | "view-recurring-invoice" | "create-recurring-invoice" | "edit-recurring-invoice" | "delete-recurring-invoice" | "view-payment" | "create-payment" | "edit-payment" | "delete-payment" | "send-payment" | "view-expense" | "create-expense" | "edit-expense" | "delete-expense" | "view-delivery-note" | "create-delivery-note" | "edit-delivery-note" | "delete-delivery-note" | "view-item" | "create-item" | "edit-item" | "delete-item" | "view-lead" | "create-lead" | "edit-lead" | "delete-lead" | "convert-lead" | "view-contact" | "create-contact" | "edit-contact" | "delete-contact" | "view-project" | "create-project" | "edit-project" | "delete-project" | "view-task" | "create-task" | "edit-task" | "delete-task" | "view-own-task" | "edit-own-task" | "view-time-entry" | "create-time-entry" | "edit-time-entry" | "delete-time-entry" | "view-own-time-entry" | "create-own-time-entry" | "edit-own-time-entry" | "delete-own-time-entry" | "view-tax-type" | "create-tax-type" | "edit-tax-type" | "delete-tax-type" | "view-custom-field" | "create-custom-field" | "edit-custom-field" | "delete-custom-field" | "view-role" | "create-role" | "edit-role" | "delete-role" | "view-financial-reports" | "view-all-notes" | "manage-all-notes" | "time_clock.punch" | "time_clock.view_own" | "time_clock.view_team" | "time_clock.correct" | "absence.request" | "absence.approve" | "report.download_legal" | "view-employee" | "create-employee" | "edit-employee" | "delete-employee" | "view-work-schedule" | "manage-work-schedule" | "view-work-calendar" | "manage-work-calendar" | "pos.operate" | "pos.supervise" | "pos.void" | "pos.discount_high" | "pos.cash_movement" | "pos.return" | "pos.admin" | "pos.report" | "view-appointment" | "create-appointment" | "edit-appointment" | "delete-appointment" | "view-contract" | "create-contract" | "edit-contract" | "delete-contract")[];
7807
8755
  };
7808
8756
  /**
7809
8757
  * RoleRequest
@@ -7828,7 +8776,7 @@ export interface components {
7828
8776
  name: string;
7829
8777
  abilities?: {
7830
8778
  /** @enum {string} */
7831
- ability: "dashboard" | "view-customer" | "create-customer" | "edit-customer" | "delete-customer" | "view-estimate" | "create-estimate" | "edit-estimate" | "delete-estimate" | "send-estimate" | "view-invoice" | "create-invoice" | "edit-invoice" | "delete-invoice" | "send-invoice" | "view-recurring-invoice" | "create-recurring-invoice" | "edit-recurring-invoice" | "delete-recurring-invoice" | "view-payment" | "create-payment" | "edit-payment" | "delete-payment" | "send-payment" | "view-expense" | "create-expense" | "edit-expense" | "delete-expense" | "view-delivery-note" | "create-delivery-note" | "edit-delivery-note" | "delete-delivery-note" | "view-item" | "create-item" | "edit-item" | "delete-item" | "view-lead" | "create-lead" | "edit-lead" | "delete-lead" | "convert-lead" | "view-contact" | "create-contact" | "edit-contact" | "delete-contact" | "view-project" | "create-project" | "edit-project" | "delete-project" | "view-task" | "create-task" | "edit-task" | "delete-task" | "view-own-task" | "edit-own-task" | "view-time-entry" | "create-time-entry" | "edit-time-entry" | "delete-time-entry" | "view-own-time-entry" | "create-own-time-entry" | "edit-own-time-entry" | "delete-own-time-entry" | "view-tax-type" | "create-tax-type" | "edit-tax-type" | "delete-tax-type" | "view-custom-field" | "create-custom-field" | "edit-custom-field" | "delete-custom-field" | "view-role" | "create-role" | "edit-role" | "delete-role" | "view-financial-reports" | "view-all-notes" | "manage-all-notes" | "time_clock.punch" | "time_clock.view_own" | "time_clock.view_team" | "time_clock.correct" | "absence.request" | "absence.approve" | "report.download_legal" | "view-employee" | "create-employee" | "edit-employee" | "delete-employee" | "view-work-schedule" | "manage-work-schedule" | "view-work-calendar" | "manage-work-calendar" | "pos.operate" | "pos.supervise" | "pos.void" | "pos.discount_high" | "pos.cash_movement" | "pos.return" | "pos.admin" | "pos.report" | "view-appointment" | "create-appointment" | "edit-appointment" | "delete-appointment";
8779
+ ability: "dashboard" | "view-customer" | "create-customer" | "edit-customer" | "delete-customer" | "view-estimate" | "create-estimate" | "edit-estimate" | "delete-estimate" | "send-estimate" | "view-invoice" | "create-invoice" | "edit-invoice" | "delete-invoice" | "send-invoice" | "view-recurring-invoice" | "create-recurring-invoice" | "edit-recurring-invoice" | "delete-recurring-invoice" | "view-payment" | "create-payment" | "edit-payment" | "delete-payment" | "send-payment" | "view-expense" | "create-expense" | "edit-expense" | "delete-expense" | "view-delivery-note" | "create-delivery-note" | "edit-delivery-note" | "delete-delivery-note" | "view-item" | "create-item" | "edit-item" | "delete-item" | "view-lead" | "create-lead" | "edit-lead" | "delete-lead" | "convert-lead" | "view-contact" | "create-contact" | "edit-contact" | "delete-contact" | "view-project" | "create-project" | "edit-project" | "delete-project" | "view-task" | "create-task" | "edit-task" | "delete-task" | "view-own-task" | "edit-own-task" | "view-time-entry" | "create-time-entry" | "edit-time-entry" | "delete-time-entry" | "view-own-time-entry" | "create-own-time-entry" | "edit-own-time-entry" | "delete-own-time-entry" | "view-tax-type" | "create-tax-type" | "edit-tax-type" | "delete-tax-type" | "view-custom-field" | "create-custom-field" | "edit-custom-field" | "delete-custom-field" | "view-role" | "create-role" | "edit-role" | "delete-role" | "view-financial-reports" | "view-all-notes" | "manage-all-notes" | "time_clock.punch" | "time_clock.view_own" | "time_clock.view_team" | "time_clock.correct" | "absence.request" | "absence.approve" | "report.download_legal" | "view-employee" | "create-employee" | "edit-employee" | "delete-employee" | "view-work-schedule" | "manage-work-schedule" | "view-work-calendar" | "manage-work-calendar" | "pos.operate" | "pos.supervise" | "pos.void" | "pos.discount_high" | "pos.cash_movement" | "pos.return" | "pos.admin" | "pos.report" | "view-appointment" | "create-appointment" | "edit-appointment" | "delete-appointment" | "view-contract" | "create-contract" | "edit-contract" | "delete-contract";
7832
8780
  }[] | null;
7833
8781
  };
7834
8782
  /** RoleResource */
@@ -8888,6 +9836,38 @@ export interface operations {
8888
9836
  422: components["responses"]["ValidationException"];
8889
9837
  };
8890
9838
  };
9839
+ "contract.activateContract": {
9840
+ parameters: {
9841
+ query?: never;
9842
+ header?: never;
9843
+ path: {
9844
+ /** @description The contract ID */
9845
+ contract: number;
9846
+ };
9847
+ cookie?: never;
9848
+ };
9849
+ requestBody?: {
9850
+ content: {
9851
+ "application/json": components["schemas"]["ActivateContractRequest"];
9852
+ };
9853
+ };
9854
+ responses: {
9855
+ /** @description `ContractResource` */
9856
+ 200: {
9857
+ headers: {
9858
+ [name: string]: unknown;
9859
+ };
9860
+ content: {
9861
+ "application/json": {
9862
+ data: components["schemas"]["ContractResource"];
9863
+ };
9864
+ };
9865
+ };
9866
+ 403: components["responses"]["AuthorizationException"];
9867
+ 404: components["responses"]["ModelNotFoundException"];
9868
+ 422: components["responses"]["ValidationException"];
9869
+ };
9870
+ };
8891
9871
  appVersion: {
8892
9872
  parameters: {
8893
9873
  query?: never;
@@ -9536,6 +10516,44 @@ export interface operations {
9536
10516
  422: components["responses"]["ValidationException"];
9537
10517
  };
9538
10518
  };
10519
+ "contract.cancelContract": {
10520
+ parameters: {
10521
+ query?: never;
10522
+ header?: never;
10523
+ path: {
10524
+ /** @description The contract ID */
10525
+ contract: number;
10526
+ };
10527
+ cookie?: never;
10528
+ };
10529
+ requestBody?: never;
10530
+ responses: {
10531
+ /** @description `ContractResource` */
10532
+ 200: {
10533
+ headers: {
10534
+ [name: string]: unknown;
10535
+ };
10536
+ content: {
10537
+ "application/json": {
10538
+ data: components["schemas"]["ContractResource"];
10539
+ };
10540
+ };
10541
+ };
10542
+ 403: components["responses"]["AuthorizationException"];
10543
+ 404: components["responses"]["ModelNotFoundException"];
10544
+ 422: {
10545
+ headers: {
10546
+ [name: string]: unknown;
10547
+ };
10548
+ content: {
10549
+ "application/json": {
10550
+ success: boolean;
10551
+ message: string;
10552
+ };
10553
+ };
10554
+ };
10555
+ };
10556
+ };
9539
10557
  "estimate.changeEstimateStatus": {
9540
10558
  parameters: {
9541
10559
  query?: never;
@@ -10094,30 +11112,36 @@ export interface operations {
10094
11112
  404: components["responses"]["ModelNotFoundException"];
10095
11113
  };
10096
11114
  };
10097
- "estimate.convertEstimate": {
11115
+ "contractDocument.upload": {
10098
11116
  parameters: {
10099
11117
  query?: never;
10100
11118
  header?: never;
10101
11119
  path: {
10102
- /** @description The estimate ID */
10103
- estimate: number;
11120
+ /** @description The contract ID */
11121
+ contract: number;
10104
11122
  };
10105
11123
  cookie?: never;
10106
11124
  };
10107
- requestBody?: {
11125
+ requestBody: {
10108
11126
  content: {
10109
- "application/json": components["schemas"]["ConvertEstimateRequest"];
11127
+ "multipart/form-data": {
11128
+ /**
11129
+ * Format: binary
11130
+ * @description Maximum file size: 10240 kilobytes.
11131
+ */
11132
+ document: Blob;
11133
+ };
10110
11134
  };
10111
11135
  };
10112
11136
  responses: {
10113
- /** @description `InvoiceResource` */
11137
+ /** @description `ContractResource` */
10114
11138
  200: {
10115
11139
  headers: {
10116
11140
  [name: string]: unknown;
10117
11141
  };
10118
11142
  content: {
10119
11143
  "application/json": {
10120
- data: components["schemas"]["InvoiceResource"];
11144
+ data: components["schemas"]["ContractResource"];
10121
11145
  };
10122
11146
  };
10123
11147
  };
@@ -10126,47 +11150,53 @@ export interface operations {
10126
11150
  422: components["responses"]["ValidationException"];
10127
11151
  };
10128
11152
  };
10129
- "general.countries": {
11153
+ "contractDocument.destroy": {
10130
11154
  parameters: {
10131
11155
  query?: never;
10132
11156
  header?: never;
10133
- path?: never;
11157
+ path: {
11158
+ /** @description The contract ID */
11159
+ contract: number;
11160
+ };
10134
11161
  cookie?: never;
10135
11162
  };
10136
11163
  requestBody?: never;
10137
11164
  responses: {
10138
- /** @description Array of `CountryResource` */
11165
+ /** @description `ContractResource` */
10139
11166
  200: {
10140
11167
  headers: {
10141
11168
  [name: string]: unknown;
10142
11169
  };
10143
11170
  content: {
10144
11171
  "application/json": {
10145
- data: components["schemas"]["CountryResource"][];
11172
+ data: components["schemas"]["ContractResource"];
10146
11173
  };
10147
11174
  };
10148
11175
  };
11176
+ 403: components["responses"]["AuthorizationException"];
11177
+ 404: components["responses"]["ModelNotFoundException"];
10149
11178
  };
10150
11179
  };
10151
- "invoice.creditNote": {
11180
+ "contracts.delete": {
10152
11181
  parameters: {
10153
11182
  query?: never;
10154
11183
  header?: never;
10155
- path: {
10156
- invoice: string;
10157
- };
11184
+ path?: never;
10158
11185
  cookie?: never;
10159
11186
  };
10160
- requestBody?: never;
11187
+ requestBody: {
11188
+ content: {
11189
+ "application/json": components["schemas"]["DeleteContractsRequest"];
11190
+ };
11191
+ };
10161
11192
  responses: {
10162
- /** @description `InvoiceResource` */
10163
11193
  200: {
10164
11194
  headers: {
10165
11195
  [name: string]: unknown;
10166
11196
  };
10167
11197
  content: {
10168
11198
  "application/json": {
10169
- data: components["schemas"]["InvoiceResource"];
11199
+ success: boolean;
10170
11200
  };
10171
11201
  };
10172
11202
  };
@@ -10174,7 +11204,7 @@ export interface operations {
10174
11204
  422: components["responses"]["ValidationException"];
10175
11205
  };
10176
11206
  };
10177
- "general.currencies": {
11207
+ "contracts.index": {
10178
11208
  parameters: {
10179
11209
  query?: never;
10180
11210
  header?: never;
@@ -10183,27 +11213,257 @@ export interface operations {
10183
11213
  };
10184
11214
  requestBody?: never;
10185
11215
  responses: {
10186
- /** @description Array of `CurrencyResource` */
11216
+ /** @description Array of `ContractResource` */
10187
11217
  200: {
10188
11218
  headers: {
10189
11219
  [name: string]: unknown;
10190
11220
  };
10191
11221
  content: {
10192
11222
  "application/json": {
10193
- data: components["schemas"]["CurrencyResource"][];
11223
+ data: components["schemas"]["ContractResource"][];
11224
+ meta: {
11225
+ contract_total_count: number;
11226
+ };
10194
11227
  };
10195
11228
  };
10196
11229
  };
11230
+ 403: components["responses"]["AuthorizationException"];
10197
11231
  };
10198
11232
  };
10199
- "custom-fields.index": {
11233
+ "contracts.store": {
10200
11234
  parameters: {
10201
11235
  query?: never;
10202
11236
  header?: never;
10203
11237
  path?: never;
10204
11238
  cookie?: never;
10205
11239
  };
10206
- requestBody?: never;
11240
+ requestBody: {
11241
+ content: {
11242
+ "application/json": components["schemas"]["ContractRequest"];
11243
+ };
11244
+ };
11245
+ responses: {
11246
+ /** @description `ContractResource` */
11247
+ 201: {
11248
+ headers: {
11249
+ [name: string]: unknown;
11250
+ };
11251
+ content: {
11252
+ "application/json": {
11253
+ data: components["schemas"]["ContractResource"];
11254
+ };
11255
+ };
11256
+ };
11257
+ 403: components["responses"]["AuthorizationException"];
11258
+ 422: components["responses"]["ValidationException"];
11259
+ };
11260
+ };
11261
+ "contracts.show": {
11262
+ parameters: {
11263
+ query?: never;
11264
+ header?: never;
11265
+ path: {
11266
+ /** @description The contract ID */
11267
+ contract: number;
11268
+ };
11269
+ cookie?: never;
11270
+ };
11271
+ requestBody?: never;
11272
+ responses: {
11273
+ /** @description `ContractResource` */
11274
+ 200: {
11275
+ headers: {
11276
+ [name: string]: unknown;
11277
+ };
11278
+ content: {
11279
+ "application/json": {
11280
+ data: components["schemas"]["ContractResource"];
11281
+ };
11282
+ };
11283
+ };
11284
+ 403: components["responses"]["AuthorizationException"];
11285
+ 404: components["responses"]["ModelNotFoundException"];
11286
+ };
11287
+ };
11288
+ "contracts.update": {
11289
+ parameters: {
11290
+ query?: never;
11291
+ header?: never;
11292
+ path: {
11293
+ /** @description The contract ID */
11294
+ contract: number;
11295
+ };
11296
+ cookie?: never;
11297
+ };
11298
+ requestBody: {
11299
+ content: {
11300
+ "application/json": components["schemas"]["ContractRequest"];
11301
+ };
11302
+ };
11303
+ responses: {
11304
+ /** @description `ContractResource` */
11305
+ 200: {
11306
+ headers: {
11307
+ [name: string]: unknown;
11308
+ };
11309
+ content: {
11310
+ "application/json": {
11311
+ data: components["schemas"]["ContractResource"];
11312
+ };
11313
+ };
11314
+ };
11315
+ 403: components["responses"]["AuthorizationException"];
11316
+ 404: components["responses"]["ModelNotFoundException"];
11317
+ 422: components["responses"]["ValidationException"];
11318
+ };
11319
+ };
11320
+ "contracts.destroy": {
11321
+ parameters: {
11322
+ query?: never;
11323
+ header?: never;
11324
+ path: {
11325
+ /** @description The contract ID */
11326
+ contract: number;
11327
+ };
11328
+ cookie?: never;
11329
+ };
11330
+ requestBody?: never;
11331
+ responses: {
11332
+ 200: {
11333
+ headers: {
11334
+ [name: string]: unknown;
11335
+ };
11336
+ content: {
11337
+ "application/json": {
11338
+ success: boolean;
11339
+ };
11340
+ };
11341
+ };
11342
+ 403: components["responses"]["AuthorizationException"];
11343
+ 404: components["responses"]["ModelNotFoundException"];
11344
+ 422: {
11345
+ headers: {
11346
+ [name: string]: unknown;
11347
+ };
11348
+ content: {
11349
+ "application/json": {
11350
+ success: boolean;
11351
+ message: string;
11352
+ };
11353
+ };
11354
+ };
11355
+ };
11356
+ };
11357
+ "estimate.convertEstimate": {
11358
+ parameters: {
11359
+ query?: never;
11360
+ header?: never;
11361
+ path: {
11362
+ /** @description The estimate ID */
11363
+ estimate: number;
11364
+ };
11365
+ cookie?: never;
11366
+ };
11367
+ requestBody?: {
11368
+ content: {
11369
+ "application/json": components["schemas"]["ConvertEstimateRequest"];
11370
+ };
11371
+ };
11372
+ responses: {
11373
+ /** @description `InvoiceResource` */
11374
+ 200: {
11375
+ headers: {
11376
+ [name: string]: unknown;
11377
+ };
11378
+ content: {
11379
+ "application/json": {
11380
+ data: components["schemas"]["InvoiceResource"];
11381
+ };
11382
+ };
11383
+ };
11384
+ 403: components["responses"]["AuthorizationException"];
11385
+ 404: components["responses"]["ModelNotFoundException"];
11386
+ 422: components["responses"]["ValidationException"];
11387
+ };
11388
+ };
11389
+ "general.countries": {
11390
+ parameters: {
11391
+ query?: never;
11392
+ header?: never;
11393
+ path?: never;
11394
+ cookie?: never;
11395
+ };
11396
+ requestBody?: never;
11397
+ responses: {
11398
+ /** @description Array of `CountryResource` */
11399
+ 200: {
11400
+ headers: {
11401
+ [name: string]: unknown;
11402
+ };
11403
+ content: {
11404
+ "application/json": {
11405
+ data: components["schemas"]["CountryResource"][];
11406
+ };
11407
+ };
11408
+ };
11409
+ };
11410
+ };
11411
+ "invoice.creditNote": {
11412
+ parameters: {
11413
+ query?: never;
11414
+ header?: never;
11415
+ path: {
11416
+ invoice: string;
11417
+ };
11418
+ cookie?: never;
11419
+ };
11420
+ requestBody?: never;
11421
+ responses: {
11422
+ /** @description `InvoiceResource` */
11423
+ 200: {
11424
+ headers: {
11425
+ [name: string]: unknown;
11426
+ };
11427
+ content: {
11428
+ "application/json": {
11429
+ data: components["schemas"]["InvoiceResource"];
11430
+ };
11431
+ };
11432
+ };
11433
+ 403: components["responses"]["AuthorizationException"];
11434
+ 422: components["responses"]["ValidationException"];
11435
+ };
11436
+ };
11437
+ "general.currencies": {
11438
+ parameters: {
11439
+ query?: never;
11440
+ header?: never;
11441
+ path?: never;
11442
+ cookie?: never;
11443
+ };
11444
+ requestBody?: never;
11445
+ responses: {
11446
+ /** @description Array of `CurrencyResource` */
11447
+ 200: {
11448
+ headers: {
11449
+ [name: string]: unknown;
11450
+ };
11451
+ content: {
11452
+ "application/json": {
11453
+ data: components["schemas"]["CurrencyResource"][];
11454
+ };
11455
+ };
11456
+ };
11457
+ };
11458
+ };
11459
+ "custom-fields.index": {
11460
+ parameters: {
11461
+ query?: never;
11462
+ header?: never;
11463
+ path?: never;
11464
+ cookie?: never;
11465
+ };
11466
+ requestBody?: never;
10207
11467
  responses: {
10208
11468
  /** @description Array of `CustomFieldResource` */
10209
11469
  200: {
@@ -10700,7 +11960,376 @@ export interface operations {
10700
11960
  403: components["responses"]["AuthorizationException"];
10701
11961
  };
10702
11962
  };
10703
- "general.dateFormats": {
11963
+ "general.dateFormats": {
11964
+ parameters: {
11965
+ query?: never;
11966
+ header?: never;
11967
+ path?: never;
11968
+ cookie?: never;
11969
+ };
11970
+ requestBody?: never;
11971
+ responses: {
11972
+ 200: {
11973
+ headers: {
11974
+ [name: string]: unknown;
11975
+ };
11976
+ content: {
11977
+ "application/json": {
11978
+ date_formats: {
11979
+ display_date: string;
11980
+ carbon_format_value: string;
11981
+ moment_format_value: string;
11982
+ }[];
11983
+ };
11984
+ };
11985
+ };
11986
+ };
11987
+ };
11988
+ "delegableCatalog.index": {
11989
+ parameters: {
11990
+ query?: never;
11991
+ header?: never;
11992
+ path?: never;
11993
+ cookie?: never;
11994
+ };
11995
+ requestBody?: never;
11996
+ responses: {
11997
+ 200: {
11998
+ headers: {
11999
+ [name: string]: unknown;
12000
+ };
12001
+ content: {
12002
+ "application/json": {
12003
+ hermes_configured: boolean;
12004
+ slug: string | null;
12005
+ tasks: {
12006
+ task_type: string;
12007
+ label: string;
12008
+ agent_skill: string | null;
12009
+ enabled: boolean;
12010
+ delegable: boolean;
12011
+ write_effect: boolean;
12012
+ default_mode: string;
12013
+ verifiability_level: number | null;
12014
+ icon: string | null;
12015
+ color: string | null;
12016
+ source: string | null;
12017
+ verified: boolean;
12018
+ skill_verified_at: string | null;
12019
+ retired_at: string | null;
12020
+ retired_reason: string | null;
12021
+ }[];
12022
+ };
12023
+ };
12024
+ };
12025
+ 403: components["responses"]["AuthorizationException"];
12026
+ };
12027
+ };
12028
+ "delegableCatalog.delegations": {
12029
+ parameters: {
12030
+ query?: never;
12031
+ header?: never;
12032
+ path?: never;
12033
+ cookie?: never;
12034
+ };
12035
+ requestBody?: never;
12036
+ responses: {
12037
+ 200: {
12038
+ headers: {
12039
+ [name: string]: unknown;
12040
+ };
12041
+ content: {
12042
+ "application/json": {
12043
+ copilot_url: string | null;
12044
+ delegations: {
12045
+ id: number;
12046
+ title: string;
12047
+ task_type: string | null;
12048
+ agent_skill: string | null;
12049
+ status: string;
12050
+ hermes_kanban_id: string | null;
12051
+ plane: string;
12052
+ origin_client_id: string | null;
12053
+ origin_client_name: string | null;
12054
+ result: string | null;
12055
+ result_data: {
12056
+ [key: string]: unknown;
12057
+ } | null;
12058
+ proposal: {
12059
+ [key: string]: unknown;
12060
+ } | null;
12061
+ proposal_status: string | null;
12062
+ proposed_at: string | null;
12063
+ applied_at: string | null;
12064
+ delegated_at: string | null;
12065
+ created_at: string | null;
12066
+ updated_at: string | null;
12067
+ }[];
12068
+ };
12069
+ };
12070
+ };
12071
+ 403: components["responses"]["AuthorizationException"];
12072
+ };
12073
+ };
12074
+ "delegableCatalog.approveProposal": {
12075
+ parameters: {
12076
+ query?: never;
12077
+ header?: never;
12078
+ path: {
12079
+ id: number;
12080
+ };
12081
+ cookie?: never;
12082
+ };
12083
+ requestBody?: {
12084
+ content: {
12085
+ "application/json": {
12086
+ human_touch_minutes?: number | null;
12087
+ /** @enum {string|null} */
12088
+ verification_outcome?: "pass" | "edit" | null;
12089
+ };
12090
+ };
12091
+ };
12092
+ responses: {
12093
+ 200: {
12094
+ headers: {
12095
+ [name: string]: unknown;
12096
+ };
12097
+ content: {
12098
+ "application/json": {
12099
+ task: {
12100
+ id: number;
12101
+ title: string;
12102
+ task_type: string | null;
12103
+ agent_skill: string | null;
12104
+ status: string;
12105
+ hermes_kanban_id: string | null;
12106
+ plane: string;
12107
+ origin_client_id: string | null;
12108
+ origin_client_name: string | null;
12109
+ result: string | null;
12110
+ result_data: {
12111
+ [key: string]: unknown;
12112
+ } | null;
12113
+ proposal: {
12114
+ [key: string]: unknown;
12115
+ } | null;
12116
+ proposal_status: string | null;
12117
+ proposed_at: string | null;
12118
+ applied_at: string | null;
12119
+ delegated_at: string | null;
12120
+ created_at: string | null;
12121
+ updated_at: string | null;
12122
+ };
12123
+ };
12124
+ };
12125
+ };
12126
+ 403: components["responses"]["AuthorizationException"];
12127
+ 422: components["responses"]["ValidationException"];
12128
+ };
12129
+ };
12130
+ "delegableCatalog.rejectProposal": {
12131
+ parameters: {
12132
+ query?: never;
12133
+ header?: never;
12134
+ path: {
12135
+ id: number;
12136
+ };
12137
+ cookie?: never;
12138
+ };
12139
+ requestBody?: {
12140
+ content: {
12141
+ "application/json": {
12142
+ reason?: string | null;
12143
+ human_touch_minutes?: number | null;
12144
+ };
12145
+ };
12146
+ };
12147
+ responses: {
12148
+ 200: {
12149
+ headers: {
12150
+ [name: string]: unknown;
12151
+ };
12152
+ content: {
12153
+ "application/json": {
12154
+ task: {
12155
+ id: number;
12156
+ title: string;
12157
+ task_type: string | null;
12158
+ agent_skill: string | null;
12159
+ status: string;
12160
+ hermes_kanban_id: string | null;
12161
+ plane: string;
12162
+ origin_client_id: string | null;
12163
+ origin_client_name: string | null;
12164
+ result: string | null;
12165
+ result_data: {
12166
+ [key: string]: unknown;
12167
+ } | null;
12168
+ proposal: {
12169
+ [key: string]: unknown;
12170
+ } | null;
12171
+ proposal_status: string | null;
12172
+ proposed_at: string | null;
12173
+ applied_at: string | null;
12174
+ delegated_at: string | null;
12175
+ created_at: string | null;
12176
+ updated_at: string | null;
12177
+ };
12178
+ };
12179
+ };
12180
+ };
12181
+ 403: components["responses"]["AuthorizationException"];
12182
+ 422: components["responses"]["ValidationException"];
12183
+ };
12184
+ };
12185
+ "delegableCatalog.needsChangesProposal": {
12186
+ parameters: {
12187
+ query?: never;
12188
+ header?: never;
12189
+ path: {
12190
+ id: number;
12191
+ };
12192
+ cookie?: never;
12193
+ };
12194
+ requestBody?: {
12195
+ content: {
12196
+ "application/json": {
12197
+ reason?: string | null;
12198
+ };
12199
+ };
12200
+ };
12201
+ responses: {
12202
+ 200: {
12203
+ headers: {
12204
+ [name: string]: unknown;
12205
+ };
12206
+ content: {
12207
+ "application/json": {
12208
+ task: {
12209
+ id: number;
12210
+ title: string;
12211
+ task_type: string | null;
12212
+ agent_skill: string | null;
12213
+ status: string;
12214
+ hermes_kanban_id: string | null;
12215
+ plane: string;
12216
+ origin_client_id: string | null;
12217
+ origin_client_name: string | null;
12218
+ result: string | null;
12219
+ result_data: {
12220
+ [key: string]: unknown;
12221
+ } | null;
12222
+ proposal: {
12223
+ [key: string]: unknown;
12224
+ } | null;
12225
+ proposal_status: string | null;
12226
+ proposed_at: string | null;
12227
+ applied_at: string | null;
12228
+ delegated_at: string | null;
12229
+ created_at: string | null;
12230
+ updated_at: string | null;
12231
+ };
12232
+ };
12233
+ };
12234
+ };
12235
+ 403: components["responses"]["AuthorizationException"];
12236
+ 422: components["responses"]["ValidationException"];
12237
+ };
12238
+ };
12239
+ "delegableCatalog.upsert": {
12240
+ parameters: {
12241
+ query?: never;
12242
+ header?: never;
12243
+ path: {
12244
+ task_type: string;
12245
+ };
12246
+ cookie?: never;
12247
+ };
12248
+ requestBody: {
12249
+ content: {
12250
+ "application/json": {
12251
+ agent_skill: string;
12252
+ label: string;
12253
+ write_effect?: boolean;
12254
+ verifiability_level?: number | null;
12255
+ icon?: string | null;
12256
+ color?: string | null;
12257
+ };
12258
+ };
12259
+ };
12260
+ responses: {
12261
+ 200: {
12262
+ headers: {
12263
+ [name: string]: unknown;
12264
+ };
12265
+ content: {
12266
+ "application/json": {
12267
+ task: {
12268
+ task_type: string;
12269
+ label: string;
12270
+ agent_skill: string | null;
12271
+ enabled: boolean;
12272
+ delegable: boolean;
12273
+ write_effect: boolean;
12274
+ default_mode: string;
12275
+ verifiability_level: number | null;
12276
+ icon: string | null;
12277
+ color: string | null;
12278
+ source: string | null;
12279
+ verified: boolean;
12280
+ skill_verified_at: string | null;
12281
+ retired_at: string | null;
12282
+ retired_reason: string | null;
12283
+ };
12284
+ verified: boolean;
12285
+ };
12286
+ };
12287
+ };
12288
+ 403: components["responses"]["AuthorizationException"];
12289
+ 422: components["responses"]["ValidationException"];
12290
+ };
12291
+ };
12292
+ "delegableCatalog.disable": {
12293
+ parameters: {
12294
+ query?: never;
12295
+ header?: never;
12296
+ path: {
12297
+ task_type: string;
12298
+ };
12299
+ cookie?: never;
12300
+ };
12301
+ requestBody?: never;
12302
+ responses: {
12303
+ 200: {
12304
+ headers: {
12305
+ [name: string]: unknown;
12306
+ };
12307
+ content: {
12308
+ "application/json": {
12309
+ task: {
12310
+ task_type: string;
12311
+ label: string;
12312
+ agent_skill: string | null;
12313
+ enabled: boolean;
12314
+ delegable: boolean;
12315
+ write_effect: boolean;
12316
+ default_mode: string;
12317
+ verifiability_level: number | null;
12318
+ icon: string | null;
12319
+ color: string | null;
12320
+ source: string | null;
12321
+ verified: boolean;
12322
+ skill_verified_at: string | null;
12323
+ retired_at: string | null;
12324
+ retired_reason: string | null;
12325
+ };
12326
+ };
12327
+ };
12328
+ };
12329
+ 403: components["responses"]["AuthorizationException"];
12330
+ };
12331
+ };
12332
+ "delegableCatalog.discover": {
10704
12333
  parameters: {
10705
12334
  query?: never;
10706
12335
  header?: never;
@@ -10715,14 +12344,151 @@ export interface operations {
10715
12344
  };
10716
12345
  content: {
10717
12346
  "application/json": {
10718
- date_formats: {
10719
- display_date: string;
10720
- carbon_format_value: string;
10721
- moment_format_value: string;
12347
+ slug: string;
12348
+ skills: {
12349
+ agent_skill: string;
12350
+ task_type: string;
12351
+ label: string;
12352
+ description: string | null;
12353
+ disabled_on_hermes: boolean;
12354
+ write_effect: boolean;
12355
+ verifiability_level: number | null;
12356
+ in_catalog: boolean;
12357
+ enabled: boolean;
10722
12358
  }[];
10723
12359
  };
10724
12360
  };
10725
12361
  };
12362
+ 403: components["responses"]["AuthorizationException"];
12363
+ };
12364
+ };
12365
+ "delegableCatalog.reverify": {
12366
+ parameters: {
12367
+ query?: never;
12368
+ header?: never;
12369
+ path: {
12370
+ task_type: string;
12371
+ };
12372
+ cookie?: never;
12373
+ };
12374
+ requestBody?: never;
12375
+ responses: {
12376
+ 200: {
12377
+ headers: {
12378
+ [name: string]: unknown;
12379
+ };
12380
+ content: {
12381
+ "application/json": {
12382
+ task: {
12383
+ task_type: string;
12384
+ label: string;
12385
+ agent_skill: string | null;
12386
+ enabled: boolean;
12387
+ delegable: boolean;
12388
+ write_effect: boolean;
12389
+ default_mode: string;
12390
+ verifiability_level: number | null;
12391
+ icon: string | null;
12392
+ color: string | null;
12393
+ source: string | null;
12394
+ verified: boolean;
12395
+ skill_verified_at: string | null;
12396
+ retired_at: string | null;
12397
+ retired_reason: string | null;
12398
+ };
12399
+ verified: boolean;
12400
+ };
12401
+ };
12402
+ };
12403
+ 403: components["responses"]["AuthorizationException"];
12404
+ };
12405
+ };
12406
+ "delegableCatalog.execute": {
12407
+ parameters: {
12408
+ query?: never;
12409
+ header?: never;
12410
+ path?: never;
12411
+ cookie?: never;
12412
+ };
12413
+ requestBody: {
12414
+ content: {
12415
+ "application/json": {
12416
+ prompt: string;
12417
+ task_type?: string | null;
12418
+ };
12419
+ };
12420
+ };
12421
+ responses: {
12422
+ 200: {
12423
+ headers: {
12424
+ [name: string]: unknown;
12425
+ };
12426
+ content: {
12427
+ "application/json": {
12428
+ skill: string | null;
12429
+ response: string;
12430
+ usage: {
12431
+ [key: string]: unknown;
12432
+ } | null;
12433
+ };
12434
+ };
12435
+ };
12436
+ 403: components["responses"]["AuthorizationException"];
12437
+ 422: components["responses"]["ValidationException"];
12438
+ };
12439
+ };
12440
+ "delegableCatalog.delegate": {
12441
+ parameters: {
12442
+ query?: never;
12443
+ header?: never;
12444
+ path?: never;
12445
+ cookie?: never;
12446
+ };
12447
+ requestBody: {
12448
+ content: {
12449
+ "application/json": {
12450
+ title: string;
12451
+ task_type?: string | null;
12452
+ context?: string | null;
12453
+ };
12454
+ };
12455
+ };
12456
+ responses: {
12457
+ 200: {
12458
+ headers: {
12459
+ [name: string]: unknown;
12460
+ };
12461
+ content: {
12462
+ "application/json": {
12463
+ task: {
12464
+ id: number;
12465
+ title: string;
12466
+ task_type: string | null;
12467
+ agent_skill: string | null;
12468
+ status: string;
12469
+ hermes_kanban_id: string | null;
12470
+ plane: string;
12471
+ origin_client_id: string | null;
12472
+ origin_client_name: string | null;
12473
+ result: string | null;
12474
+ result_data: {
12475
+ [key: string]: unknown;
12476
+ } | null;
12477
+ proposal: {
12478
+ [key: string]: unknown;
12479
+ } | null;
12480
+ proposal_status: string | null;
12481
+ proposed_at: string | null;
12482
+ applied_at: string | null;
12483
+ delegated_at: string | null;
12484
+ created_at: string | null;
12485
+ updated_at: string | null;
12486
+ };
12487
+ };
12488
+ };
12489
+ };
12490
+ 403: components["responses"]["AuthorizationException"];
12491
+ 422: components["responses"]["ValidationException"];
10726
12492
  };
10727
12493
  };
10728
12494
  "deliveryNotes.markDelivered": {
@@ -11974,6 +13740,165 @@ export interface operations {
11974
13740
  422: components["responses"]["ValidationException"];
11975
13741
  };
11976
13742
  };
13743
+ "gestoriaLink.asesorias": {
13744
+ parameters: {
13745
+ query?: {
13746
+ q?: string;
13747
+ };
13748
+ header?: never;
13749
+ path?: never;
13750
+ cookie?: never;
13751
+ };
13752
+ requestBody?: never;
13753
+ responses: {
13754
+ 200: {
13755
+ headers: {
13756
+ [name: string]: unknown;
13757
+ };
13758
+ content: {
13759
+ "application/json": {
13760
+ data: {
13761
+ id: string;
13762
+ name: string;
13763
+ nif_masked: string | null;
13764
+ email: string;
13765
+ }[];
13766
+ };
13767
+ };
13768
+ };
13769
+ };
13770
+ };
13771
+ "gestoriaLink.status": {
13772
+ parameters: {
13773
+ query?: never;
13774
+ header?: never;
13775
+ path?: never;
13776
+ cookie?: never;
13777
+ };
13778
+ requestBody?: never;
13779
+ responses: {
13780
+ 200: {
13781
+ headers: {
13782
+ [name: string]: unknown;
13783
+ };
13784
+ content: {
13785
+ "application/json": {
13786
+ data: {
13787
+ id: number;
13788
+ status: string;
13789
+ link_code: string;
13790
+ /** Format: date-time */
13791
+ requested_at: string | null;
13792
+ /** Format: date-time */
13793
+ accepted_at: string | null;
13794
+ permissions: unknown[] | null | {
13795
+ read_invoices: boolean;
13796
+ read_customers: boolean;
13797
+ read_suppliers: boolean;
13798
+ export_accounting: boolean;
13799
+ delete_data: boolean;
13800
+ };
13801
+ gestoria: {
13802
+ id: string | null;
13803
+ name: string | null;
13804
+ nif: string | null;
13805
+ email: string | null;
13806
+ phone: string | null;
13807
+ };
13808
+ } | {
13809
+ /** @constant */
13810
+ status: "none";
13811
+ permissions: {
13812
+ read_invoices: boolean;
13813
+ read_customers: boolean;
13814
+ read_suppliers: boolean;
13815
+ export_accounting: boolean;
13816
+ delete_data: boolean;
13817
+ };
13818
+ };
13819
+ };
13820
+ };
13821
+ };
13822
+ 404: components["responses"]["ModelNotFoundException"];
13823
+ };
13824
+ };
13825
+ "gestoriaLink.request": {
13826
+ parameters: {
13827
+ query?: never;
13828
+ header?: never;
13829
+ path?: never;
13830
+ cookie?: never;
13831
+ };
13832
+ requestBody?: {
13833
+ content: {
13834
+ "application/json": {
13835
+ gestoria_id?: number | null;
13836
+ link_code?: string | null;
13837
+ };
13838
+ };
13839
+ };
13840
+ responses: {
13841
+ 201: {
13842
+ headers: {
13843
+ [name: string]: unknown;
13844
+ };
13845
+ content: {
13846
+ "application/json": {
13847
+ /** @constant */
13848
+ message: "Solicitud enviada a la asesoría.";
13849
+ data: {
13850
+ id: number;
13851
+ status: string;
13852
+ link_code: string;
13853
+ /** Format: date-time */
13854
+ requested_at: string | null;
13855
+ /** Format: date-time */
13856
+ accepted_at: string | null;
13857
+ permissions: unknown[] | null | {
13858
+ read_invoices: boolean;
13859
+ read_customers: boolean;
13860
+ read_suppliers: boolean;
13861
+ export_accounting: boolean;
13862
+ delete_data: boolean;
13863
+ };
13864
+ gestoria: {
13865
+ id: string | null;
13866
+ name: string | null;
13867
+ nif: string | null;
13868
+ email: string | null;
13869
+ phone: string | null;
13870
+ };
13871
+ };
13872
+ };
13873
+ };
13874
+ };
13875
+ 404: components["responses"]["ModelNotFoundException"];
13876
+ 422: components["responses"]["ValidationException"];
13877
+ };
13878
+ };
13879
+ "gestoriaLink.revoke": {
13880
+ parameters: {
13881
+ query?: never;
13882
+ header?: never;
13883
+ path?: never;
13884
+ cookie?: never;
13885
+ };
13886
+ requestBody?: never;
13887
+ responses: {
13888
+ 200: {
13889
+ headers: {
13890
+ [name: string]: unknown;
13891
+ };
13892
+ content: {
13893
+ "application/json": {
13894
+ /** @constant */
13895
+ message: "Vinculación revocada.";
13896
+ };
13897
+ };
13898
+ };
13899
+ 404: components["responses"]["ModelNotFoundException"];
13900
+ };
13901
+ };
11977
13902
  "general.getAllUsedCurrencies": {
11978
13903
  parameters: {
11979
13904
  query?: never;
@@ -13591,14 +15516,21 @@ export interface operations {
13591
15516
  };
13592
15517
  "items.index": {
13593
15518
  parameters: {
13594
- query?: never;
15519
+ query?: {
15520
+ /** @description Con `summary`, cada fila trae solo lo que los listados leen: identidad, precios y banderas, la categoría reducida a `{id, name}`, el nombre de la unidad y los impuestos del artículo (enteros, con la misma forma que la vista completa). Sin empresa, sin moneda y sin la unidad como objeto — el recurso completo arrastra la empresa entera por fila, roles incluidos, y contra un catálogo de 200 artículos eso son ~4 s y ~900 KB de los que el 86 % es ese lastre. El artículo completo sigue en el detalle y en el índice sin este parámetro. */
15521
+ view?: "summary";
15522
+ };
13595
15523
  header?: never;
13596
15524
  path?: never;
13597
15525
  cookie?: never;
13598
15526
  };
13599
15527
  requestBody?: never;
13600
15528
  responses: {
13601
- /** @description Array of `ItemResource` */
15529
+ /**
15530
+ * @description Array of `ItemResource`
15531
+ *
15532
+ * Array of `ItemSummaryResource`
15533
+ */
13602
15534
  200: {
13603
15535
  headers: {
13604
15536
  [name: string]: unknown;
@@ -13610,6 +15542,12 @@ export interface operations {
13610
15542
  tax_types: components["schemas"]["TaxType"][];
13611
15543
  item_total_count: number;
13612
15544
  };
15545
+ } | {
15546
+ data: (components["schemas"]["ItemSummaryResource"] & Record<string, never>)[];
15547
+ meta: {
15548
+ tax_types: components["schemas"]["TaxType"][];
15549
+ item_total_count: number;
15550
+ };
13613
15551
  };
13614
15552
  };
13615
15553
  };
@@ -16206,20 +18144,52 @@ export interface operations {
16206
18144
  };
16207
18145
  header?: never;
16208
18146
  path: {
16209
- hash: string;
18147
+ hash: string;
18148
+ };
18149
+ cookie?: never;
18150
+ };
18151
+ requestBody?: never;
18152
+ responses: {
18153
+ 200: {
18154
+ headers: {
18155
+ [name: string]: unknown;
18156
+ };
18157
+ content: {
18158
+ "text/csv": Blob;
18159
+ };
18160
+ };
18161
+ 422: components["responses"]["ValidationException"];
18162
+ };
18163
+ };
18164
+ "contract.renewContract": {
18165
+ parameters: {
18166
+ query?: never;
18167
+ header?: never;
18168
+ path: {
18169
+ /** @description The contract ID */
18170
+ contract: number;
16210
18171
  };
16211
18172
  cookie?: never;
16212
18173
  };
16213
- requestBody?: never;
18174
+ requestBody: {
18175
+ content: {
18176
+ "application/json": components["schemas"]["RenewContractRequest"];
18177
+ };
18178
+ };
16214
18179
  responses: {
18180
+ /** @description `ContractResource` */
16215
18181
  200: {
16216
18182
  headers: {
16217
18183
  [name: string]: unknown;
16218
18184
  };
16219
18185
  content: {
16220
- "text/csv": Blob;
18186
+ "application/json": {
18187
+ data: components["schemas"]["ContractResource"];
18188
+ };
16221
18189
  };
16222
18190
  };
18191
+ 403: components["responses"]["AuthorizationException"];
18192
+ 404: components["responses"]["ModelNotFoundException"];
16223
18193
  422: components["responses"]["ValidationException"];
16224
18194
  };
16225
18195
  };
@@ -16859,6 +18829,126 @@ export interface operations {
16859
18829
  };
16860
18830
  };
16861
18831
  };
18832
+ "invoice.sharedLink": {
18833
+ parameters: {
18834
+ query?: never;
18835
+ header?: never;
18836
+ path: {
18837
+ /** @description The invoice ID */
18838
+ invoice: number;
18839
+ };
18840
+ cookie?: never;
18841
+ };
18842
+ requestBody?: never;
18843
+ responses: {
18844
+ 200: {
18845
+ headers: {
18846
+ [name: string]: unknown;
18847
+ };
18848
+ content: {
18849
+ "application/json": {
18850
+ data: {
18851
+ url: string;
18852
+ expires_at: string;
18853
+ };
18854
+ };
18855
+ };
18856
+ };
18857
+ 403: components["responses"]["AuthorizationException"];
18858
+ 404: components["responses"]["ModelNotFoundException"];
18859
+ 422: {
18860
+ headers: {
18861
+ [name: string]: unknown;
18862
+ };
18863
+ content: {
18864
+ "application/json": {
18865
+ /** @constant */
18866
+ message: "Un borrador no tiene enlace: publica la factura primero.";
18867
+ };
18868
+ };
18869
+ };
18870
+ };
18871
+ };
18872
+ "contract.sharedLink": {
18873
+ parameters: {
18874
+ query?: never;
18875
+ header?: never;
18876
+ path: {
18877
+ /** @description The contract ID */
18878
+ contract: number;
18879
+ };
18880
+ cookie?: never;
18881
+ };
18882
+ requestBody?: never;
18883
+ responses: {
18884
+ 200: {
18885
+ headers: {
18886
+ [name: string]: unknown;
18887
+ };
18888
+ content: {
18889
+ "application/json": {
18890
+ data: {
18891
+ url: string;
18892
+ expires_at: string;
18893
+ };
18894
+ };
18895
+ };
18896
+ };
18897
+ 403: components["responses"]["AuthorizationException"];
18898
+ 404: components["responses"]["ModelNotFoundException"];
18899
+ 422: {
18900
+ headers: {
18901
+ [name: string]: unknown;
18902
+ };
18903
+ content: {
18904
+ "application/json": {
18905
+ /** @constant */
18906
+ message: "Un contrato sin activar no tiene enlace todavía.";
18907
+ };
18908
+ };
18909
+ };
18910
+ };
18911
+ };
18912
+ "estimate.sharedLink": {
18913
+ parameters: {
18914
+ query?: never;
18915
+ header?: never;
18916
+ path: {
18917
+ /** @description The estimate ID */
18918
+ estimate: number;
18919
+ };
18920
+ cookie?: never;
18921
+ };
18922
+ requestBody?: never;
18923
+ responses: {
18924
+ 200: {
18925
+ headers: {
18926
+ [name: string]: unknown;
18927
+ };
18928
+ content: {
18929
+ "application/json": {
18930
+ data: {
18931
+ url: string;
18932
+ expires_at: string;
18933
+ };
18934
+ };
18935
+ };
18936
+ };
18937
+ 403: components["responses"]["AuthorizationException"];
18938
+ 404: components["responses"]["ModelNotFoundException"];
18939
+ 422: {
18940
+ headers: {
18941
+ [name: string]: unknown;
18942
+ };
18943
+ content: {
18944
+ "application/json": {
18945
+ /** @constant */
18946
+ message: "Un presupuesto sin número no tiene enlace todavía.";
18947
+ };
18948
+ };
18949
+ };
18950
+ };
18951
+ };
16862
18952
  "expense.showReceipt": {
16863
18953
  parameters: {
16864
18954
  query?: never;
@@ -17720,7 +19810,140 @@ export interface operations {
17720
19810
  query?: never;
17721
19811
  header?: never;
17722
19812
  path: {
17723
- hash: string;
19813
+ hash: string;
19814
+ };
19815
+ cookie?: never;
19816
+ };
19817
+ requestBody?: never;
19818
+ responses: {
19819
+ 200: {
19820
+ headers: {
19821
+ [name: string]: unknown;
19822
+ };
19823
+ content: {
19824
+ "application/pdf": Blob;
19825
+ };
19826
+ };
19827
+ 403: components["responses"]["AuthorizationException"];
19828
+ };
19829
+ };
19830
+ "tax-types.index": {
19831
+ parameters: {
19832
+ query?: never;
19833
+ header?: never;
19834
+ path?: never;
19835
+ cookie?: never;
19836
+ };
19837
+ requestBody?: never;
19838
+ responses: {
19839
+ /** @description Array of `TaxTypeResource` */
19840
+ 200: {
19841
+ headers: {
19842
+ [name: string]: unknown;
19843
+ };
19844
+ content: {
19845
+ "application/json": {
19846
+ data: components["schemas"]["TaxTypeResource"][];
19847
+ };
19848
+ };
19849
+ };
19850
+ 403: components["responses"]["AuthorizationException"];
19851
+ };
19852
+ };
19853
+ "tax-types.store": {
19854
+ parameters: {
19855
+ query?: never;
19856
+ header?: never;
19857
+ path?: never;
19858
+ cookie?: never;
19859
+ };
19860
+ requestBody: {
19861
+ content: {
19862
+ "application/json": components["schemas"]["TaxTypeRequest"];
19863
+ };
19864
+ };
19865
+ responses: {
19866
+ /** @description `TaxTypeResource` */
19867
+ 201: {
19868
+ headers: {
19869
+ [name: string]: unknown;
19870
+ };
19871
+ content: {
19872
+ "application/json": {
19873
+ data: components["schemas"]["TaxTypeResource"];
19874
+ };
19875
+ };
19876
+ };
19877
+ 403: components["responses"]["AuthorizationException"];
19878
+ 422: components["responses"]["ValidationException"];
19879
+ };
19880
+ };
19881
+ "tax-types.show": {
19882
+ parameters: {
19883
+ query?: never;
19884
+ header?: never;
19885
+ path: {
19886
+ /** @description The tax type ID */
19887
+ taxType: number;
19888
+ };
19889
+ cookie?: never;
19890
+ };
19891
+ requestBody?: never;
19892
+ responses: {
19893
+ /** @description `TaxTypeResource` */
19894
+ 200: {
19895
+ headers: {
19896
+ [name: string]: unknown;
19897
+ };
19898
+ content: {
19899
+ "application/json": {
19900
+ data: components["schemas"]["TaxTypeResource"];
19901
+ };
19902
+ };
19903
+ };
19904
+ 403: components["responses"]["AuthorizationException"];
19905
+ 404: components["responses"]["ModelNotFoundException"];
19906
+ };
19907
+ };
19908
+ "tax-types.update": {
19909
+ parameters: {
19910
+ query?: never;
19911
+ header?: never;
19912
+ path: {
19913
+ /** @description The tax type ID */
19914
+ taxType: number;
19915
+ };
19916
+ cookie?: never;
19917
+ };
19918
+ requestBody: {
19919
+ content: {
19920
+ "application/json": components["schemas"]["TaxTypeRequest"];
19921
+ };
19922
+ };
19923
+ responses: {
19924
+ /** @description `TaxTypeResource` */
19925
+ 200: {
19926
+ headers: {
19927
+ [name: string]: unknown;
19928
+ };
19929
+ content: {
19930
+ "application/json": {
19931
+ data: components["schemas"]["TaxTypeResource"];
19932
+ };
19933
+ };
19934
+ };
19935
+ 403: components["responses"]["AuthorizationException"];
19936
+ 404: components["responses"]["ModelNotFoundException"];
19937
+ 422: components["responses"]["ValidationException"];
19938
+ };
19939
+ };
19940
+ "tax-types.destroy": {
19941
+ parameters: {
19942
+ query?: never;
19943
+ header?: never;
19944
+ path: {
19945
+ /** @description The tax type ID */
19946
+ taxType: number;
17724
19947
  };
17725
19948
  cookie?: never;
17726
19949
  };
@@ -17731,133 +19954,235 @@ export interface operations {
17731
19954
  [name: string]: unknown;
17732
19955
  };
17733
19956
  content: {
17734
- "application/pdf": Blob;
19957
+ "application/json": {
19958
+ success: boolean;
19959
+ };
17735
19960
  };
17736
19961
  };
17737
19962
  403: components["responses"]["AuthorizationException"];
19963
+ 404: components["responses"]["ModelNotFoundException"];
17738
19964
  };
17739
19965
  };
17740
- "tax-types.index": {
19966
+ "taxTypes.toggleActive": {
17741
19967
  parameters: {
17742
19968
  query?: never;
17743
19969
  header?: never;
17744
- path?: never;
19970
+ path: {
19971
+ /** @description The tax type ID */
19972
+ taxType: number;
19973
+ };
17745
19974
  cookie?: never;
17746
19975
  };
17747
19976
  requestBody?: never;
17748
19977
  responses: {
17749
- /** @description Array of `TaxTypeResource` */
19978
+ /** @description `TaxTypeResource` */
17750
19979
  200: {
17751
19980
  headers: {
17752
19981
  [name: string]: unknown;
17753
19982
  };
17754
19983
  content: {
17755
19984
  "application/json": {
17756
- data: components["schemas"]["TaxTypeResource"][];
19985
+ data: components["schemas"]["TaxTypeResource"];
17757
19986
  };
17758
19987
  };
17759
19988
  };
17760
19989
  403: components["responses"]["AuthorizationException"];
19990
+ 404: components["responses"]["ModelNotFoundException"];
17761
19991
  };
17762
19992
  };
17763
- "tax-types.store": {
19993
+ "tenantDelegationCallback.delegatedIndex": {
17764
19994
  parameters: {
17765
19995
  query?: never;
17766
19996
  header?: never;
17767
19997
  path?: never;
17768
19998
  cookie?: never;
17769
19999
  };
17770
- requestBody: {
17771
- content: {
17772
- "application/json": components["schemas"]["TaxTypeRequest"];
17773
- };
17774
- };
20000
+ requestBody?: never;
17775
20001
  responses: {
17776
- /** @description `TaxTypeResource` */
17777
- 201: {
20002
+ 200: {
17778
20003
  headers: {
17779
20004
  [name: string]: unknown;
17780
20005
  };
17781
20006
  content: {
17782
20007
  "application/json": {
17783
- data: components["schemas"]["TaxTypeResource"];
17784
- };
20008
+ id: number;
20009
+ tenant_id: string;
20010
+ task_type: string | null;
20011
+ agent_skill: string | null;
20012
+ title: string;
20013
+ context: {
20014
+ [key: string]: unknown;
20015
+ } | null;
20016
+ delegation_status: string;
20017
+ delegated_at: string | null;
20018
+ hermes_kanban_id: string | null;
20019
+ result_data: {
20020
+ [key: string]: unknown;
20021
+ } | null;
20022
+ delegation_result: string | null;
20023
+ delegation_proposal: {
20024
+ [key: string]: unknown;
20025
+ } | null;
20026
+ delegation_proposal_status: string | null;
20027
+ delegation_proposed_at: string | null;
20028
+ delegation_applied_at: string | null;
20029
+ plane: string;
20030
+ origin_client_id: string | null;
20031
+ created_at: string | null;
20032
+ updated_at: string | null;
20033
+ write_effect: boolean;
20034
+ default_mode: string;
20035
+ verifiability_level: number | null;
20036
+ }[];
17785
20037
  };
17786
20038
  };
17787
- 403: components["responses"]["AuthorizationException"];
17788
- 422: components["responses"]["ValidationException"];
17789
20039
  };
17790
20040
  };
17791
- "tax-types.show": {
20041
+ "tenantDelegationCallback.taskClaim": {
17792
20042
  parameters: {
17793
20043
  query?: never;
17794
20044
  header?: never;
17795
20045
  path: {
17796
- /** @description The tax type ID */
17797
- taxType: number;
20046
+ id: number;
17798
20047
  };
17799
20048
  cookie?: never;
17800
20049
  };
17801
20050
  requestBody?: never;
17802
20051
  responses: {
17803
- /** @description `TaxTypeResource` */
17804
20052
  200: {
17805
20053
  headers: {
17806
20054
  [name: string]: unknown;
17807
20055
  };
17808
20056
  content: {
17809
20057
  "application/json": {
17810
- data: components["schemas"]["TaxTypeResource"];
20058
+ id: number;
20059
+ tenant_id: string;
20060
+ task_type: string | null;
20061
+ agent_skill: string | null;
20062
+ title: string;
20063
+ context: {
20064
+ [key: string]: unknown;
20065
+ } | null;
20066
+ delegation_status: string;
20067
+ delegated_at: string | null;
20068
+ hermes_kanban_id: string | null;
20069
+ result_data: {
20070
+ [key: string]: unknown;
20071
+ } | null;
20072
+ delegation_result: string | null;
20073
+ delegation_proposal: {
20074
+ [key: string]: unknown;
20075
+ } | null;
20076
+ delegation_proposal_status: string | null;
20077
+ delegation_proposed_at: string | null;
20078
+ delegation_applied_at: string | null;
20079
+ plane: string;
20080
+ origin_client_id: string | null;
20081
+ created_at: string | null;
20082
+ updated_at: string | null;
17811
20083
  };
17812
20084
  };
17813
20085
  };
17814
- 403: components["responses"]["AuthorizationException"];
17815
- 404: components["responses"]["ModelNotFoundException"];
17816
20086
  };
17817
20087
  };
17818
- "tax-types.update": {
20088
+ "tenantDelegationCallback.taskPropose": {
17819
20089
  parameters: {
17820
20090
  query?: never;
17821
20091
  header?: never;
17822
20092
  path: {
17823
- /** @description The tax type ID */
17824
- taxType: number;
20093
+ id: number;
17825
20094
  };
17826
20095
  cookie?: never;
17827
20096
  };
17828
20097
  requestBody: {
17829
20098
  content: {
17830
- "application/json": components["schemas"]["TaxTypeRequest"];
20099
+ "application/json": {
20100
+ proposal: {
20101
+ schema_version?: number | null;
20102
+ /** @enum {string|null} */
20103
+ mode?: "applied" | "preview" | null;
20104
+ agent_trace_id?: string | null;
20105
+ summary: string;
20106
+ changes?: {
20107
+ label: string;
20108
+ type?: string | null;
20109
+ action?: string | null;
20110
+ link?: string | null;
20111
+ record_id?: string | null;
20112
+ apply?: string[] | null;
20113
+ }[] | null;
20114
+ evals?: {
20115
+ label: string;
20116
+ pass: boolean;
20117
+ detail?: string | null;
20118
+ nivel?: number | null;
20119
+ cuenta_para_sello?: boolean | null;
20120
+ }[] | null;
20121
+ verifiability?: {
20122
+ nivel?: number | null;
20123
+ cuenta_para_sello?: boolean | null;
20124
+ /** @enum {string|null} */
20125
+ sello?: "pass" | "fail" | "n/a" | null;
20126
+ } | null;
20127
+ };
20128
+ };
17831
20129
  };
17832
20130
  };
17833
20131
  responses: {
17834
- /** @description `TaxTypeResource` */
17835
20132
  200: {
17836
20133
  headers: {
17837
20134
  [name: string]: unknown;
17838
20135
  };
17839
20136
  content: {
17840
20137
  "application/json": {
17841
- data: components["schemas"]["TaxTypeResource"];
20138
+ id: number;
20139
+ tenant_id: string;
20140
+ task_type: string | null;
20141
+ agent_skill: string | null;
20142
+ title: string;
20143
+ context: {
20144
+ [key: string]: unknown;
20145
+ } | null;
20146
+ delegation_status: string;
20147
+ delegated_at: string | null;
20148
+ hermes_kanban_id: string | null;
20149
+ result_data: {
20150
+ [key: string]: unknown;
20151
+ } | null;
20152
+ delegation_result: string | null;
20153
+ delegation_proposal: {
20154
+ [key: string]: unknown;
20155
+ } | null;
20156
+ delegation_proposal_status: string | null;
20157
+ delegation_proposed_at: string | null;
20158
+ delegation_applied_at: string | null;
20159
+ plane: string;
20160
+ origin_client_id: string | null;
20161
+ created_at: string | null;
20162
+ updated_at: string | null;
17842
20163
  };
17843
20164
  };
17844
20165
  };
17845
- 403: components["responses"]["AuthorizationException"];
17846
- 404: components["responses"]["ModelNotFoundException"];
17847
20166
  422: components["responses"]["ValidationException"];
17848
20167
  };
17849
20168
  };
17850
- "tax-types.destroy": {
20169
+ "tenantDelegationCallback.taskComplete": {
17851
20170
  parameters: {
17852
20171
  query?: never;
17853
20172
  header?: never;
17854
20173
  path: {
17855
- /** @description The tax type ID */
17856
- taxType: number;
20174
+ id: number;
17857
20175
  };
17858
20176
  cookie?: never;
17859
20177
  };
17860
- requestBody?: never;
20178
+ requestBody?: {
20179
+ content: {
20180
+ "application/json": {
20181
+ result?: string | null;
20182
+ result_data?: string[] | null;
20183
+ };
20184
+ };
20185
+ };
17861
20186
  responses: {
17862
20187
  200: {
17863
20188
  headers: {
@@ -17865,39 +20190,90 @@ export interface operations {
17865
20190
  };
17866
20191
  content: {
17867
20192
  "application/json": {
17868
- success: boolean;
20193
+ id: number;
20194
+ tenant_id: string;
20195
+ task_type: string | null;
20196
+ agent_skill: string | null;
20197
+ title: string;
20198
+ context: {
20199
+ [key: string]: unknown;
20200
+ } | null;
20201
+ delegation_status: string;
20202
+ delegated_at: string | null;
20203
+ hermes_kanban_id: string | null;
20204
+ result_data: {
20205
+ [key: string]: unknown;
20206
+ } | null;
20207
+ delegation_result: string | null;
20208
+ delegation_proposal: {
20209
+ [key: string]: unknown;
20210
+ } | null;
20211
+ delegation_proposal_status: string | null;
20212
+ delegation_proposed_at: string | null;
20213
+ delegation_applied_at: string | null;
20214
+ plane: string;
20215
+ origin_client_id: string | null;
20216
+ created_at: string | null;
20217
+ updated_at: string | null;
17869
20218
  };
17870
20219
  };
17871
20220
  };
17872
- 403: components["responses"]["AuthorizationException"];
17873
- 404: components["responses"]["ModelNotFoundException"];
20221
+ 422: components["responses"]["ValidationException"];
17874
20222
  };
17875
20223
  };
17876
- "taxTypes.toggleActive": {
20224
+ "tenantDelegationCallback.taskFail": {
17877
20225
  parameters: {
17878
20226
  query?: never;
17879
20227
  header?: never;
17880
20228
  path: {
17881
- /** @description The tax type ID */
17882
- taxType: number;
20229
+ id: number;
17883
20230
  };
17884
20231
  cookie?: never;
17885
20232
  };
17886
- requestBody?: never;
20233
+ requestBody?: {
20234
+ content: {
20235
+ "application/json": {
20236
+ result?: string | null;
20237
+ result_data?: string[] | null;
20238
+ };
20239
+ };
20240
+ };
17887
20241
  responses: {
17888
- /** @description `TaxTypeResource` */
17889
20242
  200: {
17890
20243
  headers: {
17891
20244
  [name: string]: unknown;
17892
20245
  };
17893
20246
  content: {
17894
20247
  "application/json": {
17895
- data: components["schemas"]["TaxTypeResource"];
20248
+ id: number;
20249
+ tenant_id: string;
20250
+ task_type: string | null;
20251
+ agent_skill: string | null;
20252
+ title: string;
20253
+ context: {
20254
+ [key: string]: unknown;
20255
+ } | null;
20256
+ delegation_status: string;
20257
+ delegated_at: string | null;
20258
+ hermes_kanban_id: string | null;
20259
+ result_data: {
20260
+ [key: string]: unknown;
20261
+ } | null;
20262
+ delegation_result: string | null;
20263
+ delegation_proposal: {
20264
+ [key: string]: unknown;
20265
+ } | null;
20266
+ delegation_proposal_status: string | null;
20267
+ delegation_proposed_at: string | null;
20268
+ delegation_applied_at: string | null;
20269
+ plane: string;
20270
+ origin_client_id: string | null;
20271
+ created_at: string | null;
20272
+ updated_at: string | null;
17896
20273
  };
17897
20274
  };
17898
20275
  };
17899
- 403: components["responses"]["AuthorizationException"];
17900
- 404: components["responses"]["ModelNotFoundException"];
20276
+ 422: components["responses"]["ValidationException"];
17901
20277
  };
17902
20278
  };
17903
20279
  "tenantModules.index": {
@@ -21692,6 +24068,168 @@ export interface operations {
21692
24068
  };
21693
24069
  };
21694
24070
  };
24071
+ "veriFactuSettings.index": {
24072
+ parameters: {
24073
+ query?: never;
24074
+ header?: never;
24075
+ path?: never;
24076
+ cookie?: never;
24077
+ };
24078
+ requestBody?: never;
24079
+ responses: {
24080
+ 200: {
24081
+ headers: {
24082
+ [name: string]: unknown;
24083
+ };
24084
+ content: {
24085
+ "application/json": {
24086
+ data: unknown[] | {
24087
+ id: null;
24088
+ nif: string;
24089
+ name: string;
24090
+ certificate_expires_at: null;
24091
+ is_production: boolean;
24092
+ use_representative: boolean;
24093
+ representative_nif: null;
24094
+ representative_name: null;
24095
+ /** @constant */
24096
+ authorization_status: "none";
24097
+ };
24098
+ };
24099
+ };
24100
+ };
24101
+ 500: {
24102
+ headers: {
24103
+ [name: string]: unknown;
24104
+ };
24105
+ content: {
24106
+ "application/json": {
24107
+ error: string;
24108
+ };
24109
+ };
24110
+ };
24111
+ };
24112
+ };
24113
+ "veriFactuSettings.update": {
24114
+ parameters: {
24115
+ query?: never;
24116
+ header?: never;
24117
+ path?: never;
24118
+ cookie?: never;
24119
+ };
24120
+ requestBody?: {
24121
+ content: {
24122
+ "application/json": {
24123
+ is_production?: boolean;
24124
+ use_representative?: boolean;
24125
+ representative_nif?: string | null;
24126
+ representative_name?: string | null;
24127
+ };
24128
+ };
24129
+ };
24130
+ responses: {
24131
+ /**
24132
+ * @description Sin contribuyente y sin datos para crearlo (NIF o nombre): local
24133
+ * hasta que existan.
24134
+ */
24135
+ 200: {
24136
+ headers: {
24137
+ [name: string]: unknown;
24138
+ };
24139
+ content: {
24140
+ "application/json": {
24141
+ /** @constant */
24142
+ message: "Configuración guardada localmente. Se sincronizará con VeriFactu cuando se configure el contribuyente.";
24143
+ data: unknown[];
24144
+ } | {
24145
+ /** @constant */
24146
+ message: "Configuración actualizada correctamente.";
24147
+ data: unknown[];
24148
+ };
24149
+ };
24150
+ };
24151
+ 422: components["responses"]["ValidationException"];
24152
+ 502: {
24153
+ headers: {
24154
+ [name: string]: unknown;
24155
+ };
24156
+ content: {
24157
+ "application/json": {
24158
+ error: string;
24159
+ };
24160
+ };
24161
+ };
24162
+ };
24163
+ };
24164
+ "veriFactuSettings.storeTaxpayer": {
24165
+ parameters: {
24166
+ query?: never;
24167
+ header?: never;
24168
+ path?: never;
24169
+ cookie?: never;
24170
+ };
24171
+ requestBody?: never;
24172
+ responses: {
24173
+ 200: {
24174
+ headers: {
24175
+ [name: string]: unknown;
24176
+ };
24177
+ content: {
24178
+ "application/json": {
24179
+ data: {
24180
+ [key: string]: unknown;
24181
+ } | null | unknown[];
24182
+ };
24183
+ };
24184
+ };
24185
+ 422: {
24186
+ headers: {
24187
+ [name: string]: unknown;
24188
+ };
24189
+ content: {
24190
+ "application/json": {
24191
+ error: string;
24192
+ };
24193
+ };
24194
+ };
24195
+ };
24196
+ };
24197
+ "veriFactuSettings.uploadCertificate": {
24198
+ parameters: {
24199
+ query?: never;
24200
+ header?: never;
24201
+ path?: never;
24202
+ cookie?: never;
24203
+ };
24204
+ requestBody: {
24205
+ content: {
24206
+ "multipart/form-data": {
24207
+ /**
24208
+ * Format: binary
24209
+ * @description Maximum file size: 5120 kilobytes.
24210
+ */
24211
+ certificate: Blob;
24212
+ /** @description 5MB max */
24213
+ password: string;
24214
+ };
24215
+ };
24216
+ };
24217
+ responses: {
24218
+ 200: {
24219
+ headers: {
24220
+ [name: string]: unknown;
24221
+ };
24222
+ content: {
24223
+ "application/json": {
24224
+ /** @constant */
24225
+ message: "Certificado subido correctamente.";
24226
+ data: unknown[];
24227
+ };
24228
+ };
24229
+ };
24230
+ 422: components["responses"]["ValidationException"];
24231
+ };
24232
+ };
21695
24233
  "webhookEndpoints.index": {
21696
24234
  parameters: {
21697
24235
  query?: never;