@hablala/api-contract 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -43,6 +43,46 @@ interface paths {
43
43
  patch?: never;
44
44
  trace?: never;
45
45
  };
46
+ "/v1/invite-links/accept": {
47
+ parameters: {
48
+ query?: never;
49
+ header?: never;
50
+ path?: never;
51
+ cookie?: never;
52
+ };
53
+ get?: never;
54
+ put?: never;
55
+ /**
56
+ * Canjear un link de invitación
57
+ * @description Canjea el secreto de un workspace invite link para unirse a la organización con el rol configurado en el link. A diferencia de la invitación por email, no requiere email-match: el link es el secreto.
58
+ */
59
+ post: operations["HablalaApiWeb.Orgs.InviteLinkController.accept"];
60
+ delete?: never;
61
+ options?: never;
62
+ head?: never;
63
+ patch?: never;
64
+ trace?: never;
65
+ };
66
+ "/v1/invite-links/preview": {
67
+ parameters: {
68
+ query?: never;
69
+ header?: never;
70
+ path?: never;
71
+ cookie?: never;
72
+ };
73
+ /**
74
+ * Previsualizar un link de invitación
75
+ * @description Devuelve la organización (nombre + icono) a la que lleva un workspace invite link, sin consumirlo ni requerir sesión. Sirve para mostrar a dónde te unes en `/join` antes de confirmar. Siempre 200: el `status` del cuerpo distingue `valid` de `invalid`.
76
+ */
77
+ get: operations["HablalaApiWeb.Orgs.InviteLinkController.preview"];
78
+ put?: never;
79
+ post?: never;
80
+ delete?: never;
81
+ options?: never;
82
+ head?: never;
83
+ patch?: never;
84
+ trace?: never;
85
+ };
46
86
  "/v1/organizations": {
47
87
  parameters: {
48
88
  query?: never;
@@ -81,6 +121,50 @@ interface paths {
81
121
  patch: operations["HablalaApiWeb.Orgs.OrganizationController.update (2)"];
82
122
  trace?: never;
83
123
  };
124
+ "/v1/organizations/{organization_id}/access-tokens": {
125
+ parameters: {
126
+ query?: never;
127
+ header?: never;
128
+ path?: never;
129
+ cookie?: never;
130
+ };
131
+ /**
132
+ * Listar access tokens
133
+ * @description Los access tokens de máquina de la organización (solo metadatos; el secreto no se recupera).
134
+ */
135
+ get: operations["HablalaApiWeb.AccessTokens.TokenController.index"];
136
+ put?: never;
137
+ /**
138
+ * Crear un access token
139
+ * @description Emite una credencial de máquina (`hpat_…`) con la que un agente (Claude Code / Lá) o un script CI escribe la ontología por HTTP. La respuesta incluye el secreto en claro UNA sola vez (`token`); guárdalo, no se puede recuperar. Los permisos se intersectan con los del creador (un token nunca puede más que quien lo emite).
140
+ */
141
+ post: operations["HablalaApiWeb.AccessTokens.TokenController.create"];
142
+ delete?: never;
143
+ options?: never;
144
+ head?: never;
145
+ patch?: never;
146
+ trace?: never;
147
+ };
148
+ "/v1/organizations/{organization_id}/access-tokens/{id}": {
149
+ parameters: {
150
+ query?: never;
151
+ header?: never;
152
+ path?: never;
153
+ cookie?: never;
154
+ };
155
+ get?: never;
156
+ put?: never;
157
+ post?: never;
158
+ /**
159
+ * Revocar un access token
160
+ * @description Revoca la credencial (irreversible). Las requests que la usen dejan de autenticar.
161
+ */
162
+ delete: operations["HablalaApiWeb.AccessTokens.TokenController.delete"];
163
+ options?: never;
164
+ head?: never;
165
+ patch?: never;
166
+ trace?: never;
167
+ };
84
168
  "/v1/organizations/{organization_id}/conversations": {
85
169
  parameters: {
86
170
  query?: never;
@@ -363,6 +447,26 @@ interface paths {
363
447
  patch?: never;
364
448
  trace?: never;
365
449
  };
450
+ "/v1/organizations/{organization_id}/invitations/bulk": {
451
+ parameters: {
452
+ query?: never;
453
+ header?: never;
454
+ path?: never;
455
+ cookie?: never;
456
+ };
457
+ get?: never;
458
+ put?: never;
459
+ /**
460
+ * Invitar a varios emails a la vez
461
+ * @description Crea (o reenvía) invitaciones para una lista de emails, todos con el mismo rol opcional. No es todo-o-nada: cada email se procesa aparte y su resultado se refleja por separado (`sent` / `already` / `invalid`).
462
+ */
463
+ post: operations["HablalaApiWeb.Orgs.InvitationController.bulk"];
464
+ delete?: never;
465
+ options?: never;
466
+ head?: never;
467
+ patch?: never;
468
+ trace?: never;
469
+ };
366
470
  "/v1/organizations/{organization_id}/invitations/{id}": {
367
471
  parameters: {
368
472
  query?: never;
@@ -381,6 +485,47 @@ interface paths {
381
485
  patch?: never;
382
486
  trace?: never;
383
487
  };
488
+ "/v1/organizations/{organization_id}/invite-link": {
489
+ parameters: {
490
+ query?: never;
491
+ header?: never;
492
+ path?: never;
493
+ cookie?: never;
494
+ };
495
+ /**
496
+ * Obtener el link de invitación de la org
497
+ * @description Devuelve el link activo, creándolo si no existe (lazy). El secreto en claro (`url`) solo viaja cuando se acaba de crear; en llamadas siguientes se devuelve el link sin el claro (que no se puede recuperar).
498
+ */
499
+ get: operations["HablalaApiWeb.Orgs.InviteLinkController.show"];
500
+ put?: never;
501
+ post?: never;
502
+ /** Revocar el link de invitación */
503
+ delete: operations["HablalaApiWeb.Orgs.InviteLinkController.delete"];
504
+ options?: never;
505
+ head?: never;
506
+ patch?: never;
507
+ trace?: never;
508
+ };
509
+ "/v1/organizations/{organization_id}/invite-link/rotate": {
510
+ parameters: {
511
+ query?: never;
512
+ header?: never;
513
+ path?: never;
514
+ cookie?: never;
515
+ };
516
+ get?: never;
517
+ put?: never;
518
+ /**
519
+ * Rotar el link de invitación
520
+ * @description Revoca el link activo (si hay) y crea uno nuevo. El secreto anterior deja de canjear al instante; el nuevo claro (`url`) viaja en la respuesta.
521
+ */
522
+ post: operations["HablalaApiWeb.Orgs.InviteLinkController.rotate"];
523
+ delete?: never;
524
+ options?: never;
525
+ head?: never;
526
+ patch?: never;
527
+ trace?: never;
528
+ };
384
529
  "/v1/organizations/{organization_id}/memberships": {
385
530
  parameters: {
386
531
  query?: never;
@@ -1162,6 +1307,77 @@ interface paths {
1162
1307
  }
1163
1308
  interface components {
1164
1309
  schemas: {
1310
+ /**
1311
+ * AccessToken
1312
+ * @description Metadatos de un access token de máquina (`hpat_…`): la credencial con la que un agente (Claude Code / Lá) o un script CI escribe la ontología por HTTP. El secreto en claro NO se incluye aquí — solo se devuelve una vez, al crearlo.
1313
+ */
1314
+ AccessToken: {
1315
+ /** @description ¿Ni revocado ni expirado? */
1316
+ active: boolean;
1317
+ /** Format: date-time */
1318
+ expiresAt?: string | null;
1319
+ id: string;
1320
+ /** Format: date-time */
1321
+ insertedAt?: string;
1322
+ /** Format: date-time */
1323
+ lastUsedAt?: string | null;
1324
+ /** @description Etiqueta para el panel (p. ej. "CI deploy"). */
1325
+ name: string;
1326
+ /** @description Permisos RBAC del token (`recurso:accion`), su propio scope (mínimo privilegio). */
1327
+ permissions: string[];
1328
+ /** @description Primeros caracteres del secreto (no secreto), p. ej. `hpat_a1b2`. */
1329
+ prefix?: string | null;
1330
+ /** Format: date-time */
1331
+ revokedAt?: string | null;
1332
+ /** Format: date-time */
1333
+ updatedAt?: string;
1334
+ };
1335
+ /**
1336
+ * AccessTokenCreated
1337
+ * @description El token recién creado, con el secreto en claro (`token`) presente UNA sola vez. Guárdalo: no se puede recuperar después.
1338
+ */
1339
+ AccessTokenCreated: {
1340
+ active?: boolean;
1341
+ /** Format: date-time */
1342
+ expiresAt?: string | null;
1343
+ id: string;
1344
+ /** Format: date-time */
1345
+ insertedAt?: string;
1346
+ /** Format: date-time */
1347
+ lastUsedAt?: string | null;
1348
+ name: string;
1349
+ permissions: string[];
1350
+ prefix?: string | null;
1351
+ /** Format: date-time */
1352
+ revokedAt?: string | null;
1353
+ /** @description El secreto en claro (`hpat_…`). Solo en esta respuesta. */
1354
+ token: string;
1355
+ /** Format: date-time */
1356
+ updatedAt?: string;
1357
+ };
1358
+ /** AccessTokenCreatedResponse */
1359
+ AccessTokenCreatedResponse: {
1360
+ data: components["schemas"]["AccessTokenCreated"];
1361
+ };
1362
+ /**
1363
+ * AccessTokenRequest
1364
+ * @description Datos para emitir un access token. Los permisos se intersectan con los del creador (privilege de-escalation): un token nunca puede más que quien lo emite.
1365
+ */
1366
+ AccessTokenRequest: {
1367
+ /**
1368
+ * Format: date-time
1369
+ * @description Caducidad opcional (ISO 8601). Omitir = no caduca.
1370
+ */
1371
+ expiresAt?: string;
1372
+ /** @description Etiqueta para identificarlo en el panel. */
1373
+ name: string;
1374
+ /** @description Permisos RBAC (`recurso:accion`), p. ej. `["objects:create", "objects:read"]`. */
1375
+ permissions: string[];
1376
+ };
1377
+ /** AccessTokensResponse */
1378
+ AccessTokensResponse: {
1379
+ data: components["schemas"]["AccessToken"][];
1380
+ };
1165
1381
  /**
1166
1382
  * AddMemberRequest
1167
1383
  * @description Añade un usuario del tenant a una conversación (invitar a un canal).
@@ -1231,6 +1447,30 @@ interface components {
1231
1447
  AttributesResponse: {
1232
1448
  data: components["schemas"]["Attribute"][];
1233
1449
  };
1450
+ /**
1451
+ * BulkInvitationRequest
1452
+ * @description Invita a varios emails a la vez, todos con el mismo rol opcional.
1453
+ */
1454
+ BulkInvitationRequest: {
1455
+ /** @description Lista de emails a invitar. Duplicados y vacíos se ignoran. */
1456
+ emails: string[];
1457
+ /** @description Rol que recibirán los invitados (opcional; id público `role_…`). */
1458
+ role_id?: string | null;
1459
+ };
1460
+ /**
1461
+ * BulkInvitationResponse
1462
+ * @description Un resultado por email de entrada, en el mismo orden.
1463
+ */
1464
+ BulkInvitationResponse: {
1465
+ data: {
1466
+ email: string;
1467
+ /**
1468
+ * @description `sent` (invitación creada/reenviada), `already` (ya es miembro), `invalid` (email mal formado o falló al persistir).
1469
+ * @enum {string}
1470
+ */
1471
+ status: "sent" | "already" | "invalid";
1472
+ }[];
1473
+ };
1234
1474
  /** ChannelRequest */
1235
1475
  ChannelRequest: {
1236
1476
  channel: {
@@ -1479,6 +1719,58 @@ interface components {
1479
1719
  InvitationsResponse: {
1480
1720
  data: components["schemas"]["Invitation"][];
1481
1721
  };
1722
+ /**
1723
+ * InviteLink
1724
+ * @description Workspace invite link de una organización. El secreto en claro (`token`/`url`) solo está presente al crearlo o rotarlo; en un `show` posterior es `null`.
1725
+ */
1726
+ InviteLink: {
1727
+ /**
1728
+ * Format: date-time
1729
+ * @description Caducidad opcional; `null` = no caduca.
1730
+ */
1731
+ expiresAt?: string | null;
1732
+ id: string;
1733
+ /** Format: date-time */
1734
+ insertedAt?: string;
1735
+ /** @description Primeros caracteres del secreto (`invl_a1b2…`), para mostrar sin el claro. */
1736
+ prefix?: string | null;
1737
+ /** @description Rol con el que entra quien canjea el link. */
1738
+ role?: {
1739
+ id?: string;
1740
+ name?: string;
1741
+ } | null;
1742
+ /** @description Secreto en claro (`invl_…`). Presente SOLO al crear/rotar. */
1743
+ token?: string | null;
1744
+ /** Format: date-time */
1745
+ updatedAt?: string;
1746
+ /** @description URL compartible (`/join?token=…`). Presente SOLO al crear/rotar. */
1747
+ url?: string | null;
1748
+ };
1749
+ /** InviteLinkAcceptRequest */
1750
+ InviteLinkAcceptRequest: {
1751
+ /** @description Secreto del link (`invl_…`) a canjear. */
1752
+ token: string;
1753
+ };
1754
+ /**
1755
+ * InviteLinkPreviewResponse
1756
+ * @description Datos públicos de un invite link para mostrar a qué organización lleva.
1757
+ */
1758
+ InviteLinkPreviewResponse: {
1759
+ data: {
1760
+ /** @description Icono del workspace; `null` usa el fallback de iniciales. */
1761
+ organizationAvatarUrl?: string | null;
1762
+ organizationName?: string | null;
1763
+ /**
1764
+ * @description `valid` (se puede unir) o `invalid` (revocado/caducado/inexistente).
1765
+ * @enum {string}
1766
+ */
1767
+ status: "valid" | "invalid";
1768
+ };
1769
+ };
1770
+ /** InviteLinkResponse */
1771
+ InviteLinkResponse: {
1772
+ data: components["schemas"]["InviteLink"];
1773
+ };
1482
1774
  /**
1483
1775
  * LogicalQueryRequest
1484
1776
  * @description Consulta lógica con slugs del diccionario. Ver docs/04-query-engine.
@@ -2356,6 +2648,71 @@ interface operations {
2356
2648
  };
2357
2649
  };
2358
2650
  };
2651
+ "HablalaApiWeb.Orgs.InviteLinkController.accept": {
2652
+ parameters: {
2653
+ query?: never;
2654
+ header?: never;
2655
+ path?: never;
2656
+ cookie?: never;
2657
+ };
2658
+ /** @description Secreto del link */
2659
+ requestBody?: {
2660
+ content: {
2661
+ "application/json": components["schemas"]["InviteLinkAcceptRequest"];
2662
+ };
2663
+ };
2664
+ responses: {
2665
+ /** @description Membresía creada */
2666
+ 201: {
2667
+ headers: {
2668
+ [name: string]: unknown;
2669
+ };
2670
+ content: {
2671
+ "application/json": components["schemas"]["MembershipResponse"];
2672
+ };
2673
+ };
2674
+ /** @description Link inválido, revocado o caducado */
2675
+ 404: {
2676
+ headers: {
2677
+ [name: string]: unknown;
2678
+ };
2679
+ content: {
2680
+ "application/json": components["schemas"]["Error"];
2681
+ };
2682
+ };
2683
+ /** @description Ya eres miembro */
2684
+ 422: {
2685
+ headers: {
2686
+ [name: string]: unknown;
2687
+ };
2688
+ content: {
2689
+ "application/json": components["schemas"]["Error"];
2690
+ };
2691
+ };
2692
+ };
2693
+ };
2694
+ "HablalaApiWeb.Orgs.InviteLinkController.preview": {
2695
+ parameters: {
2696
+ query: {
2697
+ token: string;
2698
+ };
2699
+ header?: never;
2700
+ path?: never;
2701
+ cookie?: never;
2702
+ };
2703
+ requestBody?: never;
2704
+ responses: {
2705
+ /** @description Datos del link */
2706
+ 200: {
2707
+ headers: {
2708
+ [name: string]: unknown;
2709
+ };
2710
+ content: {
2711
+ "application/json": components["schemas"]["InviteLinkPreviewResponse"];
2712
+ };
2713
+ };
2714
+ };
2715
+ };
2359
2716
  "HablalaApiWeb.Orgs.OrganizationController.index": {
2360
2717
  parameters: {
2361
2718
  query?: never;
@@ -2533,6 +2890,103 @@ interface operations {
2533
2890
  };
2534
2891
  };
2535
2892
  };
2893
+ "HablalaApiWeb.AccessTokens.TokenController.index": {
2894
+ parameters: {
2895
+ query?: never;
2896
+ header?: never;
2897
+ path: {
2898
+ organization_id: string;
2899
+ };
2900
+ cookie?: never;
2901
+ };
2902
+ requestBody?: never;
2903
+ responses: {
2904
+ /** @description Tokens */
2905
+ 200: {
2906
+ headers: {
2907
+ [name: string]: unknown;
2908
+ };
2909
+ content: {
2910
+ "application/json": components["schemas"]["AccessTokensResponse"];
2911
+ };
2912
+ };
2913
+ };
2914
+ };
2915
+ "HablalaApiWeb.AccessTokens.TokenController.create": {
2916
+ parameters: {
2917
+ query?: never;
2918
+ header?: never;
2919
+ path: {
2920
+ organization_id: string;
2921
+ };
2922
+ cookie?: never;
2923
+ };
2924
+ /** @description Datos del token */
2925
+ requestBody?: {
2926
+ content: {
2927
+ "application/json": components["schemas"]["AccessTokenRequest"];
2928
+ };
2929
+ };
2930
+ responses: {
2931
+ /** @description Token creado (con secreto) */
2932
+ 201: {
2933
+ headers: {
2934
+ [name: string]: unknown;
2935
+ };
2936
+ content: {
2937
+ "application/json": components["schemas"]["AccessTokenCreatedResponse"];
2938
+ };
2939
+ };
2940
+ /** @description Sin permiso */
2941
+ 403: {
2942
+ headers: {
2943
+ [name: string]: unknown;
2944
+ };
2945
+ content: {
2946
+ "application/json": components["schemas"]["Error"];
2947
+ };
2948
+ };
2949
+ /** @description Error de validación */
2950
+ 422: {
2951
+ headers: {
2952
+ [name: string]: unknown;
2953
+ };
2954
+ content: {
2955
+ "application/json": components["schemas"]["Error"];
2956
+ };
2957
+ };
2958
+ };
2959
+ };
2960
+ "HablalaApiWeb.AccessTokens.TokenController.delete": {
2961
+ parameters: {
2962
+ query?: never;
2963
+ header?: never;
2964
+ path: {
2965
+ organization_id: string;
2966
+ id: string;
2967
+ };
2968
+ cookie?: never;
2969
+ };
2970
+ requestBody?: never;
2971
+ responses: {
2972
+ /** @description Revocado */
2973
+ 204: {
2974
+ headers: {
2975
+ [name: string]: unknown;
2976
+ };
2977
+ content?: never;
2978
+ };
2979
+ /** @description Sin permiso */
2980
+ 403: {
2981
+ headers: {
2982
+ [name: string]: unknown;
2983
+ };
2984
+ content: {
2985
+ "application/json": components["schemas"]["Error"];
2986
+ };
2987
+ };
2988
+ };
2989
+ };
2536
2990
  "HablalaApiWeb.Messaging.ConversationController.index": {
2537
2991
  parameters: {
2538
2992
  query?: never;
@@ -3321,6 +3775,51 @@ interface operations {
3321
3775
  };
3322
3776
  };
3323
3777
  };
3778
+ "HablalaApiWeb.Orgs.InvitationController.bulk": {
3779
+ parameters: {
3780
+ query?: never;
3781
+ header?: never;
3782
+ path: {
3783
+ organization_id: string;
3784
+ };
3785
+ cookie?: never;
3786
+ };
3787
+ /** @description Emails a invitar */
3788
+ requestBody?: {
3789
+ content: {
3790
+ "application/json": components["schemas"]["BulkInvitationRequest"];
3791
+ };
3792
+ };
3793
+ responses: {
3794
+ /** @description Resultado por email */
3795
+ 200: {
3796
+ headers: {
3797
+ [name: string]: unknown;
3798
+ };
3799
+ content: {
3800
+ "application/json": components["schemas"]["BulkInvitationResponse"];
3801
+ };
3802
+ };
3803
+ /** @description Sin permiso */
3804
+ 403: {
3805
+ headers: {
3806
+ [name: string]: unknown;
3807
+ };
3808
+ content: {
3809
+ "application/json": components["schemas"]["Error"];
3810
+ };
3811
+ };
3812
+ /** @description Error de validación */
3813
+ 422: {
3814
+ headers: {
3815
+ [name: string]: unknown;
3816
+ };
3817
+ content: {
3818
+ "application/json": components["schemas"]["Error"];
3819
+ };
3820
+ };
3821
+ };
3822
+ };
3324
3823
  "HablalaApiWeb.Orgs.InvitationController.show": {
3325
3824
  parameters: {
3326
3825
  query?: never;
@@ -3383,6 +3882,97 @@ interface operations {
3383
3882
  };
3384
3883
  };
3385
3884
  };
3885
+ "HablalaApiWeb.Orgs.InviteLinkController.show": {
3886
+ parameters: {
3887
+ query?: never;
3888
+ header?: never;
3889
+ path: {
3890
+ organization_id: string;
3891
+ };
3892
+ cookie?: never;
3893
+ };
3894
+ requestBody?: never;
3895
+ responses: {
3896
+ /** @description Link de invitación */
3897
+ 200: {
3898
+ headers: {
3899
+ [name: string]: unknown;
3900
+ };
3901
+ content: {
3902
+ "application/json": components["schemas"]["InviteLinkResponse"];
3903
+ };
3904
+ };
3905
+ /** @description Sin permiso */
3906
+ 403: {
3907
+ headers: {
3908
+ [name: string]: unknown;
3909
+ };
3910
+ content: {
3911
+ "application/json": components["schemas"]["Error"];
3912
+ };
3913
+ };
3914
+ };
3915
+ };
3916
+ "HablalaApiWeb.Orgs.InviteLinkController.delete": {
3917
+ parameters: {
3918
+ query?: never;
3919
+ header?: never;
3920
+ path: {
3921
+ organization_id: string;
3922
+ };
3923
+ cookie?: never;
3924
+ };
3925
+ requestBody?: never;
3926
+ responses: {
3927
+ /** @description Revocado (idempotente: sin link activo también responde 204) */
3928
+ 204: {
3929
+ headers: {
3930
+ [name: string]: unknown;
3931
+ };
3932
+ content?: never;
3933
+ };
3934
+ /** @description Sin permiso */
3935
+ 403: {
3936
+ headers: {
3937
+ [name: string]: unknown;
3938
+ };
3939
+ content: {
3940
+ "application/json": components["schemas"]["Error"];
3941
+ };
3942
+ };
3943
+ };
3944
+ };
3945
+ "HablalaApiWeb.Orgs.InviteLinkController.rotate": {
3946
+ parameters: {
3947
+ query?: never;
3948
+ header?: never;
3949
+ path: {
3950
+ organization_id: string;
3951
+ };
3952
+ cookie?: never;
3953
+ };
3954
+ requestBody?: never;
3955
+ responses: {
3956
+ /** @description Link rotado */
3957
+ 201: {
3958
+ headers: {
3959
+ [name: string]: unknown;
3960
+ };
3961
+ content: {
3962
+ "application/json": components["schemas"]["InviteLinkResponse"];
3963
+ };
3964
+ };
3965
+ /** @description Sin permiso */
3966
+ 403: {
3967
+ headers: {
3968
+ [name: string]: unknown;
3969
+ };
3970
+ content: {
3971
+ "application/json": components["schemas"]["Error"];
3972
+ };
3973
+ };
3974
+ };
3975
+ };
3386
3976
  "HablalaApiWeb.Orgs.MembershipController.index": {
3387
3977
  parameters: {
3388
3978
  query?: never;