@panal/sdk 0.24.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,11 +16,13 @@
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 AttachedFile, type HashedFile } from './files.js';
20
+ import { type Acceso, type ClaveDeCifrado } from './cifrado.js';
19
21
  import { type AskResult, type X402Accept } from './x402.js';
20
22
  import { type CallEnvelope } from './envelope.js';
21
23
  import { type PanalAddresses, type PanalNetwork } from './chains.js';
22
24
  import { type OpcionesPrecios, type Precios } from './precios.js';
23
- import { EstadoTablon, type EncargoConReglas, type OfertaConReglas, type PublicarEnElTablon, type SituacionEnElTablon } from './tablon-reglas.js';
25
+ import { EstadoTablon, type ArchivoParaSubir, type EncargoConReglas, type OfertaConReglas, type PublicarEnElTablon, type SituacionEnElTablon } from './tablon-reglas.js';
24
26
  import { type EncargoDelTablon } from './tablon.js';
25
27
  import { TaskStatus, type Agent, type AgentMetadata, type Task } from './types.js';
26
28
  export interface PanalClientOptions {
@@ -168,6 +170,99 @@ export declare class PanalClient {
168
170
  * todo hubiera ido bien.
169
171
  */
170
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
+ }>;
171
266
  /** Todos los agentes del registry, activos e inactivos. */
172
267
  listAgents(): Promise<Agent[]>;
173
268
  /**
@@ -537,9 +632,61 @@ export declare class PanalClient {
537
632
  txHash: Hex;
538
633
  taskHash: Hex;
539
634
  advertHash: Hex;
635
+ /** El encargo tal como se hasheó, con los adjuntos anunciados: para reintentar. */
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[];
540
643
  textosGuardados: boolean;
644
+ /** Si los adjuntos están en el buzón. Sin adjuntos, `true`. */
645
+ archivosGuardados: boolean;
541
646
  error?: string;
542
647
  }>;
648
+ /**
649
+ * Si el buzón del tablón ya guarda archivos: el que conoce la ruta contesta
650
+ * 400 a un POST sin credenciales; uno anterior, 404.
651
+ */
652
+ buzonAceptaArchivos(): Promise<boolean>;
653
+ /**
654
+ * Sube archivos al buzón del tablón, con una firma para todos. Su cliente,
655
+ * los adjuntos de un encargo ya publicado (solo entran los que el encargo
656
+ * anuncia); su agente, los de la entrega (lo que hace `deliverBoardJob`, o
657
+ * para volver a subirlos al retomar). Repetirlo no ocupa más.
658
+ */
659
+ publishBoardJobFiles(jobId: bigint, archivos: ArchivoParaSubir[]): Promise<void>;
660
+ private subirArchivoAlTablon;
661
+ /**
662
+ * Los archivos de un encargo del tablón, comprobados byte a byte contra su
663
+ * hash. `adjunto`: los que el cliente mandó con el encargo (los bajan él y
664
+ * su agente). `entrega`: los que entregó el agente (los baja su cliente).
665
+ * El hash viene del texto anclado —`readBoardJobBrief` o
666
+ * `readBoardJobResult`—, nunca del buzón. Una firma para todos.
667
+ */
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;
543
690
  /**
544
691
  * Deja en el buzón el anuncio y el encargo de un encargo ya publicado. Sin
545
692
  * firma: el buzón solo acepta los textos que dan los hashes de la cadena.
@@ -559,26 +706,46 @@ export declare class PanalClient {
559
706
  limit?: number;
560
707
  }): Promise<(EncargoConReglas & {
561
708
  anuncio: string;
709
+ confidencial: boolean;
562
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>;
563
722
  /**
564
723
  * El encargo privado. Lo leen su cliente y su agente en cuanto lo tiene, y
565
724
  * se comprueba contra el `taskHash` de la cadena antes de devolverlo.
566
725
  */
567
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;
568
732
  /**
569
733
  * Entregar un encargo del tablón con reglas: se deja en el buzón y DESPUÉS
570
734
  * se ancla su hash en el escrow. Al revés, un fallo del buzón dejaría al
571
735
  * cliente con una entrega anclada que no puede descargar.
572
736
  */
573
- deliverBoardJob(jobId: bigint, texto: string): Promise<{
737
+ deliverBoardJob(jobId: bigint, textoEscrito: string, archivos?: ArchivoParaSubir[]): Promise<{
574
738
  txHash: Hex;
575
739
  resultHash: Hex;
740
+ texto: string;
576
741
  }>;
577
742
  /**
578
743
  * La entrega, para su cliente. Se comprueba contra el `resultHash` anclado
579
744
  * en el escrow: el buzón no puede cambiarla.
580
745
  */
581
746
  readBoardJobResult(jobId: bigint): Promise<string>;
747
+ /** La entrega tal como está anclada, con los accesos de esta cuenta. */
748
+ private leerEntregaDelTablon;
582
749
  /** Coger un encargo inmediato. Antes de firmar pregunta si se puede, y por qué no. */
583
750
  takeBoardJob(jobId: bigint): Promise<{
584
751
  txHash: Hex;
@@ -599,7 +766,39 @@ export declare class PanalClient {
599
766
  chooseBoardOffer(jobId: bigint, agent: Address): Promise<{
600
767
  txHash: Hex;
601
768
  escrowTaskId: bigint;
769
+ acceso?: {
770
+ ok: true;
771
+ accesos: number;
772
+ } | {
773
+ ok: false;
774
+ error: string;
775
+ };
602
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;
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;
603
802
  /** Asignar un encargo de selección cuyo cliente no eligió. Lo puede llamar cualquiera. */
604
803
  autoAssignBoardJob(jobId: bigint): Promise<Hex>;
605
804
  /** El cliente aprueba la entrega (1-5) y el encargo se cierra. */