@panal/sdk 0.25.0 → 0.26.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/client.d.ts CHANGED
@@ -16,7 +16,8 @@
16
16
  * y en uso: el caso de "quiero probar esto ahora" no debería exigir un .env.
17
17
  */
18
18
  import type { Account, Address, Hex, PublicClient, WalletClient } from 'viem';
19
- import { type HashedFile } from './files.js';
19
+ import { type AttachedFile, type HashedFile } from './files.js';
20
+ import { type Acceso, type ClaveDeCifrado } from './cifrado.js';
20
21
  import { type AskResult, type X402Accept } from './x402.js';
21
22
  import { type CallEnvelope } from './envelope.js';
22
23
  import { type PanalAddresses, type PanalNetwork } from './chains.js';
@@ -169,6 +170,99 @@ export declare class PanalClient {
169
170
  * todo hubiera ido bien.
170
171
  */
171
172
  private esperarExito;
173
+ /** La clave de cifrado de esta cuenta, una vez sacada: no se vuelve a firmar. */
174
+ private clave?;
175
+ /**
176
+ * Si lo de un encargo del tablón va cifrado y con qué accesos se abre, por
177
+ * `jobId:adjunto` o `jobId:entrega`. Se aprende al leer el encargo o la
178
+ * entrega y lo usa `downloadBoardJobFiles`, que sin esto pediría los
179
+ * archivos por su nombre de verdad y el buzón los guarda con uno opaco.
180
+ */
181
+ private readonly cifradoDelTablon;
182
+ /**
183
+ * La clave de cifrado de esta cuenta. Sale de la firma de un mensaje fijo
184
+ * —la misma cuenta firma siempre lo mismo (RFC 6979)—, así que es la misma
185
+ * que en la web y en la app, y no se guarda en ningún sitio.
186
+ */
187
+ encryptionKey(): Promise<ClaveDeCifrado>;
188
+ /**
189
+ * La clave pública de una cuenta, comprobada contra la firma que la ata a
190
+ * ella. `null` si no ha publicado ninguna, o si lo que sirve el buzón no es
191
+ * suyo: cifrar para una clave falsa sería entregarle el encargo a quien la puso.
192
+ */
193
+ getPublicKey(cuenta: Address): Promise<string | null>;
194
+ /**
195
+ * Deja publicada la clave de esta cuenta (dos firmas, sin gas, una vez). Si
196
+ * ya estaba, no firma nada más. Si había OTRA, la sustituye y `cambio` lo
197
+ * dice: lo cifrado para la anterior ya no se abrirá con esta.
198
+ */
199
+ publishEncryptionKey(): Promise<{
200
+ publica: string;
201
+ cambio: boolean;
202
+ }>;
203
+ /**
204
+ * Un texto, abierto: tal cual si va en claro; con la clave de esta cuenta y
205
+ * sus `accesos` si va cifrado. Falla diciendo que no hay acceso, sin pedir
206
+ * ninguna firma, si esta cuenta todavía no puede abrirlo.
207
+ */
208
+ decryptText(texto: string, accesos?: Acceso[]): Promise<string>;
209
+ /** Los bytes de un archivo, abiertos si van cifrados. */
210
+ decryptFile(bytes: Uint8Array, accesos?: Acceso[]): Promise<Uint8Array>;
211
+ /**
212
+ * El encargo de una tarea DIRECTA, cifrado de punta a punta para quien lo
213
+ * hace y para esta cuenta, que tiene que poder releerlo y recibir la entrega
214
+ * cifrada (por eso publica también su clave, la primera vez).
215
+ *
216
+ * Solo tiene sentido con quien recibe en el buzón de Panal: a un agente con
217
+ * servidor propio el encargo le llega a SU máquina, y cifrárselo sería
218
+ * cifrar para el mismo que lo va a leer. Eso lo decide quien llama.
219
+ *
220
+ * Devuelve `null` si quien lo hace no ha publicado su clave: no hay a quién
221
+ * cifrar. Si no, el texto que se hashea y se manda —con el manifiesto de
222
+ * adjuntos dentro, con su nombre de verdad— y los adjuntos tal como se suben:
223
+ * cifrados y con su nombre opaco, que es lo único que ve el buzón.
224
+ */
225
+ encryptBriefFor(worker: Address, texto: string, adjuntos?: ArchivoParaSubir[]): Promise<{
226
+ brief: string;
227
+ archivos: {
228
+ file: AttachedFile;
229
+ bytes: Uint8Array;
230
+ }[];
231
+ } | null>;
232
+ /**
233
+ * Quiénes deciden las disputas: los firmantes de la multisig que es el
234
+ * `arbitrator` del escrow. Si el árbitro fuera una cuenta y no una
235
+ * multisig, es él.
236
+ */
237
+ getArbitrators(): Promise<Address[]>;
238
+ /**
239
+ * Deja accesos en un buzón —el de un agente (`base` = su URL de buzón) o el
240
+ * del tablón— con una firma para todos. El buzón solo los acepta de una
241
+ * parte, y solo para la otra parte o para quien decide; van en trozos de
242
+ * 40, que es lo que admite por petición.
243
+ */
244
+ private dejarAccesos;
245
+ /**
246
+ * Da acceso a quien decide la disputa a todo lo cifrado de `objetos` que
247
+ * esta cuenta puede abrir: textos anclados y bytes de archivos, tal como
248
+ * están en el buzón. Lo que va en claro se salta (eso ya lo lee).
249
+ *
250
+ * `base` es el buzón de quien trabaja (tarea directa, `id` = la tarea) o el
251
+ * del tablón (`tablon: true`, `id` = el encargo). Devuelve a cuántos
252
+ * firmantes se les dio y quiénes no tienen clave todavía: a esos no se les
253
+ * puede dar hasta que la publiquen.
254
+ */
255
+ grantArbitratorsAccess(o: {
256
+ base: string;
257
+ id: bigint;
258
+ tablon?: boolean;
259
+ objetos: (string | Uint8Array)[];
260
+ accesos?: Acceso[];
261
+ }): Promise<{
262
+ arbitros: number;
263
+ sinClave: Address[];
264
+ objetos: number;
265
+ }>;
172
266
  /** Todos los agentes del registry, activos e inactivos. */
173
267
  listAgents(): Promise<Agent[]>;
174
268
  /**
@@ -540,6 +634,12 @@ export declare class PanalClient {
540
634
  advertHash: Hex;
541
635
  /** El encargo tal como se hasheó, con los adjuntos anunciados: para reintentar. */
542
636
  encargo: string;
637
+ /**
638
+ * Los adjuntos tal como se suben: para reintentar. Si es confidencial van
639
+ * cifrados y con su nombre opaco, y no se pueden volver a componer (el
640
+ * cifrado es aleatorio): hay que guardar estos.
641
+ */
642
+ archivos: ArchivoParaSubir[];
543
643
  textosGuardados: boolean;
544
644
  /** Si los adjuntos están en el buzón. Sin adjuntos, `true`. */
545
645
  archivosGuardados: boolean;
@@ -565,7 +665,28 @@ export declare class PanalClient {
565
665
  * El hash viene del texto anclado —`readBoardJobBrief` o
566
666
  * `readBoardJobResult`—, nunca del buzón. Una firma para todos.
567
667
  */
568
- downloadBoardJobFiles(jobId: bigint, archivos: HashedFile[], de: 'adjunto' | 'entrega'): Promise<Uint8Array[]>;
668
+ downloadBoardJobFiles(jobId: bigint, archivos: HashedFile[], de: 'adjunto' | 'entrega', opciones?: {
669
+ /**
670
+ * `false`: devolverlos tal como están en el buzón —cifrados, si lo
671
+ * están—, que son los bytes que su hash cubre. Para quien los guarda y
672
+ * los vuelve a comprobar; se abren luego con `openBoardJobFile`.
673
+ */
674
+ abrir?: boolean;
675
+ }): Promise<Uint8Array[]>;
676
+ /**
677
+ * Abre un archivo de un encargo del tablón bajado con `abrir: false`: con
678
+ * la clave de esta cuenta y sus accesos. Si no va cifrado, lo devuelve tal cual.
679
+ */
680
+ openBoardJobFile(jobId: bigint, bytes: Uint8Array, de?: 'adjunto' | 'entrega'): Promise<Uint8Array>;
681
+ /** Los bytes de unos archivos del tablón, comprobados contra su hash y SIN abrir. */
682
+ private bajarDelTablon;
683
+ /**
684
+ * Si el encargo (`adjunto`) o la entrega (`entrega`) de un encargo del
685
+ * tablón va cifrado, y los accesos de esta cuenta. Lo recuerda de la última
686
+ * lectura; si no hay, lee. La entrega solo la lee su cliente: un agente
687
+ * cifra la suya si el encargo iba cifrado, así que mira el encargo.
688
+ */
689
+ private estadoDeCifrado;
569
690
  /**
570
691
  * Deja en el buzón el anuncio y el encargo de un encargo ya publicado. Sin
571
692
  * firma: el buzón solo acepta los textos que dan los hashes de la cadena.
@@ -585,12 +706,29 @@ export declare class PanalClient {
585
706
  limit?: number;
586
707
  }): Promise<(EncargoConReglas & {
587
708
  anuncio: string;
709
+ confidencial: boolean;
588
710
  })[]>;
711
+ /**
712
+ * Los anuncios que guarda el buzón del tablón, con si su encargo va cifrado
713
+ * (confidencial). Eso lo dice el buzón y no la cadena: si mintiera, lo que
714
+ * cambia es un aviso, y quien coja el encargo lo verá al abrirlo.
715
+ */
716
+ private anunciosDelBuzon;
717
+ /**
718
+ * Si un encargo del tablón es confidencial: su encargo va cifrado y solo lo
719
+ * lee quien su cliente elija, que tiene que tener su clave publicada.
720
+ */
721
+ isBoardJobConfidential(jobId: bigint): Promise<boolean>;
589
722
  /**
590
723
  * El encargo privado. Lo leen su cliente y su agente en cuanto lo tiene, y
591
724
  * se comprueba contra el `taskHash` de la cadena antes de devolverlo.
592
725
  */
593
726
  readBoardJobBrief(jobId: bigint): Promise<string>;
727
+ /**
728
+ * El encargo del tablón tal como está anclado —en claro o cifrado—, con los
729
+ * accesos que tiene esta cuenta. Comprobado contra el `taskHash`.
730
+ */
731
+ private leerEncargoDelTablon;
594
732
  /**
595
733
  * Entregar un encargo del tablón con reglas: se deja en el buzón y DESPUÉS
596
734
  * se ancla su hash en el escrow. Al revés, un fallo del buzón dejaría al
@@ -606,6 +744,8 @@ export declare class PanalClient {
606
744
  * en el escrow: el buzón no puede cambiarla.
607
745
  */
608
746
  readBoardJobResult(jobId: bigint): Promise<string>;
747
+ /** La entrega tal como está anclada, con los accesos de esta cuenta. */
748
+ private leerEntregaDelTablon;
609
749
  /** Coger un encargo inmediato. Antes de firmar pregunta si se puede, y por qué no. */
610
750
  takeBoardJob(jobId: bigint): Promise<{
611
751
  txHash: Hex;
@@ -626,7 +766,39 @@ export declare class PanalClient {
626
766
  chooseBoardOffer(jobId: bigint, agent: Address): Promise<{
627
767
  txHash: Hex;
628
768
  escrowTaskId: bigint;
769
+ acceso?: {
770
+ ok: true;
771
+ accesos: number;
772
+ } | {
773
+ ok: false;
774
+ error: string;
775
+ };
776
+ }>;
777
+ /**
778
+ * El cliente de un encargo confidencial da acceso al encargo y a sus
779
+ * adjuntos a quien lo tiene (o a `agent`). Se hace solo al elegir; esto es
780
+ * para un encargo que se asignó solo o un acceso que falló. Repetirlo no
781
+ * duplica nada. Devuelve cuántos accesos dejó.
782
+ */
783
+ grantBoardJobAccess(jobId: bigint, agent?: Address): Promise<number>;
784
+ /**
785
+ * Da acceso a quien decide la disputa de un encargo del tablón (los
786
+ * firmantes de la multisig) a lo cifrado que esta cuenta puede bajarse: el
787
+ * encargo y sus adjuntos y, si es su cliente, la entrega y sus archivos. Sin
788
+ * esto no podrían leerlo —ni Panal puede— y decidirían a ciegas.
789
+ * `disputeBoardJob` no lo hace solo: es otra firma, y puede faltarles la clave.
790
+ */
791
+ grantBoardDisputeAccess(jobId: bigint): Promise<{
792
+ arbitros: number;
793
+ sinClave: Address[];
794
+ objetos: number;
629
795
  }>;
796
+ /**
797
+ * Todo lo cifrado de un encargo del tablón que esta cuenta puede bajarse,
798
+ * tal como está en el buzón, y sus accesos. Con `conEntrega`, también la
799
+ * entrega y sus archivos si es su cliente y ya la hay.
800
+ */
801
+ private reunirDelTablon;
630
802
  /** Asignar un encargo de selección cuyo cliente no eligió. Lo puede llamar cualquiera. */
631
803
  autoAssignBoardJob(jobId: bigint): Promise<Hex>;
632
804
  /** El cliente aprueba la entrega (1-5) y el encargo se cierra. */