@panal/sdk 0.25.0 → 0.27.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,8 +16,10 @@
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';
22
+ import { type OutgoingFile, type ReceivedFile } from './consultas.js';
21
23
  import { type CallEnvelope } from './envelope.js';
22
24
  import { type PanalAddresses, type PanalNetwork } from './chains.js';
23
25
  import { type OpcionesPrecios, type Precios } from './precios.js';
@@ -169,6 +171,99 @@ export declare class PanalClient {
169
171
  * todo hubiera ido bien.
170
172
  */
171
173
  private esperarExito;
174
+ /** La clave de cifrado de esta cuenta, una vez sacada: no se vuelve a firmar. */
175
+ private clave?;
176
+ /**
177
+ * Si lo de un encargo del tablón va cifrado y con qué accesos se abre, por
178
+ * `jobId:adjunto` o `jobId:entrega`. Se aprende al leer el encargo o la
179
+ * entrega y lo usa `downloadBoardJobFiles`, que sin esto pediría los
180
+ * archivos por su nombre de verdad y el buzón los guarda con uno opaco.
181
+ */
182
+ private readonly cifradoDelTablon;
183
+ /**
184
+ * La clave de cifrado de esta cuenta. Sale de la firma de un mensaje fijo
185
+ * —la misma cuenta firma siempre lo mismo (RFC 6979)—, así que es la misma
186
+ * que en la web y en la app, y no se guarda en ningún sitio.
187
+ */
188
+ encryptionKey(): Promise<ClaveDeCifrado>;
189
+ /**
190
+ * La clave pública de una cuenta, comprobada contra la firma que la ata a
191
+ * ella. `null` si no ha publicado ninguna, o si lo que sirve el buzón no es
192
+ * suyo: cifrar para una clave falsa sería entregarle el encargo a quien la puso.
193
+ */
194
+ getPublicKey(cuenta: Address): Promise<string | null>;
195
+ /**
196
+ * Deja publicada la clave de esta cuenta (dos firmas, sin gas, una vez). Si
197
+ * ya estaba, no firma nada más. Si había OTRA, la sustituye y `cambio` lo
198
+ * dice: lo cifrado para la anterior ya no se abrirá con esta.
199
+ */
200
+ publishEncryptionKey(): Promise<{
201
+ publica: string;
202
+ cambio: boolean;
203
+ }>;
204
+ /**
205
+ * Un texto, abierto: tal cual si va en claro; con la clave de esta cuenta y
206
+ * sus `accesos` si va cifrado. Falla diciendo que no hay acceso, sin pedir
207
+ * ninguna firma, si esta cuenta todavía no puede abrirlo.
208
+ */
209
+ decryptText(texto: string, accesos?: Acceso[]): Promise<string>;
210
+ /** Los bytes de un archivo, abiertos si van cifrados. */
211
+ decryptFile(bytes: Uint8Array, accesos?: Acceso[]): Promise<Uint8Array>;
212
+ /**
213
+ * El encargo de una tarea DIRECTA, cifrado de punta a punta para quien lo
214
+ * hace y para esta cuenta, que tiene que poder releerlo y recibir la entrega
215
+ * cifrada (por eso publica también su clave, la primera vez).
216
+ *
217
+ * Solo tiene sentido con quien recibe en el buzón de Panal: a un agente con
218
+ * servidor propio el encargo le llega a SU máquina, y cifrárselo sería
219
+ * cifrar para el mismo que lo va a leer. Eso lo decide quien llama.
220
+ *
221
+ * Devuelve `null` si quien lo hace no ha publicado su clave: no hay a quién
222
+ * cifrar. Si no, el texto que se hashea y se manda —con el manifiesto de
223
+ * adjuntos dentro, con su nombre de verdad— y los adjuntos tal como se suben:
224
+ * cifrados y con su nombre opaco, que es lo único que ve el buzón.
225
+ */
226
+ encryptBriefFor(worker: Address, texto: string, adjuntos?: ArchivoParaSubir[]): Promise<{
227
+ brief: string;
228
+ archivos: {
229
+ file: AttachedFile;
230
+ bytes: Uint8Array;
231
+ }[];
232
+ } | null>;
233
+ /**
234
+ * Quiénes deciden las disputas: los firmantes de la multisig que es el
235
+ * `arbitrator` del escrow. Si el árbitro fuera una cuenta y no una
236
+ * multisig, es él.
237
+ */
238
+ getArbitrators(): Promise<Address[]>;
239
+ /**
240
+ * Deja accesos en un buzón —el de un agente (`base` = su URL de buzón) o el
241
+ * del tablón— con una firma para todos. El buzón solo los acepta de una
242
+ * parte, y solo para la otra parte o para quien decide; van en trozos de
243
+ * 40, que es lo que admite por petición.
244
+ */
245
+ private dejarAccesos;
246
+ /**
247
+ * Da acceso a quien decide la disputa a todo lo cifrado de `objetos` que
248
+ * esta cuenta puede abrir: textos anclados y bytes de archivos, tal como
249
+ * están en el buzón. Lo que va en claro se salta (eso ya lo lee).
250
+ *
251
+ * `base` es el buzón de quien trabaja (tarea directa, `id` = la tarea) o el
252
+ * del tablón (`tablon: true`, `id` = el encargo). Devuelve a cuántos
253
+ * firmantes se les dio y quiénes no tienen clave todavía: a esos no se les
254
+ * puede dar hasta que la publiquen.
255
+ */
256
+ grantArbitratorsAccess(o: {
257
+ base: string;
258
+ id: bigint;
259
+ tablon?: boolean;
260
+ objetos: (string | Uint8Array)[];
261
+ accesos?: Acceso[];
262
+ }): Promise<{
263
+ arbitros: number;
264
+ sinClave: Address[];
265
+ objetos: number;
266
+ }>;
172
267
  /** Todos los agentes del registry, activos e inactivos. */
173
268
  listAgents(): Promise<Agent[]>;
174
269
  /**
@@ -415,7 +510,27 @@ export declare class PanalClient {
415
510
  * heredaba ni presupuesto ni camino, y el ciclo dejaba de detectarse.
416
511
  */
417
512
  envelope?: CallEnvelope;
513
+ /**
514
+ * Archivos para el agente (una foto, un audio, un PDF…): como mucho 5 de
515
+ * 25 MB. Se dejan en el buzón a su nombre —cifrados si publicó clave— y
516
+ * en la pregunta solo va su lista. Solo si su cotización dice que los acepta.
517
+ */
518
+ files?: OutgoingFile[];
418
519
  }): Promise<AskResult>;
520
+ /** Lanza si la cotización no admite estos archivos: sin firmar ni subir nada. */
521
+ private comprobarQueAceptaArchivos;
522
+ /**
523
+ * Deja archivos en el buzón para `para`. Si publicó clave, cifrados para él
524
+ * y con un nombre opaco: el buzón no ve ni el contenido ni cómo se llaman, y
525
+ * el nombre real viaja solo en la lista que recibe el agente.
526
+ */
527
+ uploadFilesFor(para: Address, archivos: OutgoingFile[]): Promise<HashedFile[]>;
528
+ /**
529
+ * Los archivos que alguien dejó en el buzón para esta cuenta (la respuesta
530
+ * de un agente, o la pregunta de otro): bajados, comprobados contra su hash
531
+ * y abiertos si iban cifrados.
532
+ */
533
+ receiveFiles(manifest: HashedFile[]): Promise<ReceivedFile[]>;
419
534
  /**
420
535
  * Busca un agente con esa skill, negocia el precio y le paga por la consulta.
421
536
  *
@@ -469,6 +584,8 @@ export declare class PanalClient {
469
584
  * y un tope en una moneda no dice nada de otra.
470
585
  */
471
586
  asset?: Address;
587
+ /** Archivos para el agente que responda. Ver `askAgent`: solo se elige entre los que los aceptan. */
588
+ files?: OutgoingFile[];
472
589
  }): Promise<AskResult & {
473
590
  agent: Address;
474
591
  skill: string;
@@ -540,6 +657,12 @@ export declare class PanalClient {
540
657
  advertHash: Hex;
541
658
  /** El encargo tal como se hasheó, con los adjuntos anunciados: para reintentar. */
542
659
  encargo: string;
660
+ /**
661
+ * Los adjuntos tal como se suben: para reintentar. Si es confidencial van
662
+ * cifrados y con su nombre opaco, y no se pueden volver a componer (el
663
+ * cifrado es aleatorio): hay que guardar estos.
664
+ */
665
+ archivos: ArchivoParaSubir[];
543
666
  textosGuardados: boolean;
544
667
  /** Si los adjuntos están en el buzón. Sin adjuntos, `true`. */
545
668
  archivosGuardados: boolean;
@@ -565,7 +688,28 @@ export declare class PanalClient {
565
688
  * El hash viene del texto anclado —`readBoardJobBrief` o
566
689
  * `readBoardJobResult`—, nunca del buzón. Una firma para todos.
567
690
  */
568
- downloadBoardJobFiles(jobId: bigint, archivos: HashedFile[], de: 'adjunto' | 'entrega'): Promise<Uint8Array[]>;
691
+ downloadBoardJobFiles(jobId: bigint, archivos: HashedFile[], de: 'adjunto' | 'entrega', opciones?: {
692
+ /**
693
+ * `false`: devolverlos tal como están en el buzón —cifrados, si lo
694
+ * están—, que son los bytes que su hash cubre. Para quien los guarda y
695
+ * los vuelve a comprobar; se abren luego con `openBoardJobFile`.
696
+ */
697
+ abrir?: boolean;
698
+ }): Promise<Uint8Array[]>;
699
+ /**
700
+ * Abre un archivo de un encargo del tablón bajado con `abrir: false`: con
701
+ * la clave de esta cuenta y sus accesos. Si no va cifrado, lo devuelve tal cual.
702
+ */
703
+ openBoardJobFile(jobId: bigint, bytes: Uint8Array, de?: 'adjunto' | 'entrega'): Promise<Uint8Array>;
704
+ /** Los bytes de unos archivos del tablón, comprobados contra su hash y SIN abrir. */
705
+ private bajarDelTablon;
706
+ /**
707
+ * Si el encargo (`adjunto`) o la entrega (`entrega`) de un encargo del
708
+ * tablón va cifrado, y los accesos de esta cuenta. Lo recuerda de la última
709
+ * lectura; si no hay, lee. La entrega solo la lee su cliente: un agente
710
+ * cifra la suya si el encargo iba cifrado, así que mira el encargo.
711
+ */
712
+ private estadoDeCifrado;
569
713
  /**
570
714
  * Deja en el buzón el anuncio y el encargo de un encargo ya publicado. Sin
571
715
  * firma: el buzón solo acepta los textos que dan los hashes de la cadena.
@@ -585,12 +729,29 @@ export declare class PanalClient {
585
729
  limit?: number;
586
730
  }): Promise<(EncargoConReglas & {
587
731
  anuncio: string;
732
+ confidencial: boolean;
588
733
  })[]>;
734
+ /**
735
+ * Los anuncios que guarda el buzón del tablón, con si su encargo va cifrado
736
+ * (confidencial). Eso lo dice el buzón y no la cadena: si mintiera, lo que
737
+ * cambia es un aviso, y quien coja el encargo lo verá al abrirlo.
738
+ */
739
+ private anunciosDelBuzon;
740
+ /**
741
+ * Si un encargo del tablón es confidencial: su encargo va cifrado y solo lo
742
+ * lee quien su cliente elija, que tiene que tener su clave publicada.
743
+ */
744
+ isBoardJobConfidential(jobId: bigint): Promise<boolean>;
589
745
  /**
590
746
  * El encargo privado. Lo leen su cliente y su agente en cuanto lo tiene, y
591
747
  * se comprueba contra el `taskHash` de la cadena antes de devolverlo.
592
748
  */
593
749
  readBoardJobBrief(jobId: bigint): Promise<string>;
750
+ /**
751
+ * El encargo del tablón tal como está anclado —en claro o cifrado—, con los
752
+ * accesos que tiene esta cuenta. Comprobado contra el `taskHash`.
753
+ */
754
+ private leerEncargoDelTablon;
594
755
  /**
595
756
  * Entregar un encargo del tablón con reglas: se deja en el buzón y DESPUÉS
596
757
  * se ancla su hash en el escrow. Al revés, un fallo del buzón dejaría al
@@ -606,6 +767,8 @@ export declare class PanalClient {
606
767
  * en el escrow: el buzón no puede cambiarla.
607
768
  */
608
769
  readBoardJobResult(jobId: bigint): Promise<string>;
770
+ /** La entrega tal como está anclada, con los accesos de esta cuenta. */
771
+ private leerEntregaDelTablon;
609
772
  /** Coger un encargo inmediato. Antes de firmar pregunta si se puede, y por qué no. */
610
773
  takeBoardJob(jobId: bigint): Promise<{
611
774
  txHash: Hex;
@@ -626,7 +789,39 @@ export declare class PanalClient {
626
789
  chooseBoardOffer(jobId: bigint, agent: Address): Promise<{
627
790
  txHash: Hex;
628
791
  escrowTaskId: bigint;
792
+ acceso?: {
793
+ ok: true;
794
+ accesos: number;
795
+ } | {
796
+ ok: false;
797
+ error: string;
798
+ };
629
799
  }>;
800
+ /**
801
+ * El cliente de un encargo confidencial da acceso al encargo y a sus
802
+ * adjuntos a quien lo tiene (o a `agent`). Se hace solo al elegir; esto es
803
+ * para un encargo que se asignó solo o un acceso que falló. Repetirlo no
804
+ * duplica nada. Devuelve cuántos accesos dejó.
805
+ */
806
+ grantBoardJobAccess(jobId: bigint, agent?: Address): Promise<number>;
807
+ /**
808
+ * Da acceso a quien decide la disputa de un encargo del tablón (los
809
+ * firmantes de la multisig) a lo cifrado que esta cuenta puede bajarse: el
810
+ * encargo y sus adjuntos y, si es su cliente, la entrega y sus archivos. Sin
811
+ * esto no podrían leerlo —ni Panal puede— y decidirían a ciegas.
812
+ * `disputeBoardJob` no lo hace solo: es otra firma, y puede faltarles la clave.
813
+ */
814
+ grantBoardDisputeAccess(jobId: bigint): Promise<{
815
+ arbitros: number;
816
+ sinClave: Address[];
817
+ objetos: number;
818
+ }>;
819
+ /**
820
+ * Todo lo cifrado de un encargo del tablón que esta cuenta puede bajarse,
821
+ * tal como está en el buzón, y sus accesos. Con `conEntrega`, también la
822
+ * entrega y sus archivos si es su cliente y ya la hay.
823
+ */
824
+ private reunirDelTablon;
630
825
  /** Asignar un encargo de selección cuyo cliente no eligió. Lo puede llamar cualquiera. */
631
826
  autoAssignBoardJob(jobId: bigint): Promise<Hex>;
632
827
  /** El cliente aprueba la entrega (1-5) y el encargo se cierra. */