@panal/sdk 0.14.0 → 0.15.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/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/types.js +29 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -23,7 +23,7 @@ export { PanalClient, createPanalClient } from './client.js';
|
|
|
23
23
|
export type { PanalClientOptions, HireParams, HireResult } from './client.js';
|
|
24
24
|
export { monad, monadTestnet, addressesFor, chainFor, MAINNET_ADDRESSES, TESTNET_ADDRESSES, NATIVE_CURRENCY, FEE_BPS, AUTO_RELEASE_SECONDS, DISPUTE_TIMEOUT_SECONDS, } from './chains.js';
|
|
25
25
|
export type { PanalNetwork, PanalAddresses } from './chains.js';
|
|
26
|
-
export { TaskStatus, TASK_STATUS_LABEL, formatAgentMetadata, normalizeAgentLink, parseAgentMetadata, AGENT_LINK_KEYS, } from './types.js';
|
|
26
|
+
export { TaskStatus, TASK_STATUS_LABEL, formatAgentMetadata, normalizeAgentLink, parseAgentMetadata, AGENT_LINK_KEYS, MAX_LOGO_DATA, isEmbeddedLogo, } from './types.js';
|
|
27
27
|
export type { Agent, AgentLinkKey, AgentLinks, AgentMetadata, Task } from './types.js';
|
|
28
28
|
export { erc20Abi, escrowAbi, registryAbi } from './abis.js';
|
|
29
29
|
export { X402_SCHEME, X402Error, payAndAsk, quoteAsk } from './x402.js';
|
package/dist/index.js
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
*/
|
|
22
22
|
export { PanalClient, createPanalClient } from './client.js';
|
|
23
23
|
export { monad, monadTestnet, addressesFor, chainFor, MAINNET_ADDRESSES, TESTNET_ADDRESSES, NATIVE_CURRENCY, FEE_BPS, AUTO_RELEASE_SECONDS, DISPUTE_TIMEOUT_SECONDS, } from './chains.js';
|
|
24
|
-
export { TaskStatus, TASK_STATUS_LABEL, formatAgentMetadata, normalizeAgentLink, parseAgentMetadata, AGENT_LINK_KEYS, } from './types.js';
|
|
24
|
+
export { TaskStatus, TASK_STATUS_LABEL, formatAgentMetadata, normalizeAgentLink, parseAgentMetadata, AGENT_LINK_KEYS, MAX_LOGO_DATA, isEmbeddedLogo, } from './types.js';
|
|
25
25
|
export { erc20Abi, escrowAbi, registryAbi } from './abis.js';
|
|
26
26
|
// x402: pagar a otro agente por una consulta, sin escrow y sin humano.
|
|
27
27
|
export { X402_SCHEME, X402Error, payAndAsk, quoteAsk } from './x402.js';
|
package/dist/types.d.ts
CHANGED
|
@@ -58,6 +58,19 @@ export declare const AGENT_LINK_KEYS: readonly ["logo", "web", "github", "x", "t
|
|
|
58
58
|
export type AgentLinkKey = (typeof AGENT_LINK_KEYS)[number];
|
|
59
59
|
/** Cadena vacía = el agente no lo publicó. */
|
|
60
60
|
export type AgentLinks = Record<AgentLinkKey, string>;
|
|
61
|
+
/**
|
|
62
|
+
* Tope del logo cuando la imagen viaja DENTRO de la ficha, en caracteres.
|
|
63
|
+
*
|
|
64
|
+
* El logo tiene dos formas: una URL https —la imagen vive en el dominio del
|
|
65
|
+
* agente— o la imagen misma en base64. La segunda existe porque la primera
|
|
66
|
+
* pide un sitio donde alojar un archivo, que es justo lo que no tiene quien se
|
|
67
|
+
* registra desde la web. La referencia sigue siendo `src/lib/marca.ts` del
|
|
68
|
+
* marketplace: aquí solo hay que LEER igual, o un logo incrustado saldría
|
|
69
|
+
* recortado a 120 caracteres y con eso no se pinta nada.
|
|
70
|
+
*/
|
|
71
|
+
export declare const MAX_LOGO_DATA = 5000;
|
|
72
|
+
/** ¿Es una imagen incrustada válida en un token `logo:`? */
|
|
73
|
+
export declare function isEmbeddedLogo(value: string): boolean;
|
|
61
74
|
/**
|
|
62
75
|
* Deja un valor de marca como se guarda, o vacío si no sirve.
|
|
63
76
|
*
|
package/dist/types.js
CHANGED
|
@@ -26,6 +26,29 @@ export const TASK_STATUS_LABEL = {
|
|
|
26
26
|
/** Las claves de marca que entiende el marketplace, en el orden en que se pintan. */
|
|
27
27
|
export const AGENT_LINK_KEYS = ['logo', 'web', 'github', 'x', 'telegram'];
|
|
28
28
|
const NO_LINKS = { logo: '', web: '', github: '', x: '', telegram: '' };
|
|
29
|
+
/**
|
|
30
|
+
* Tope del logo cuando la imagen viaja DENTRO de la ficha, en caracteres.
|
|
31
|
+
*
|
|
32
|
+
* El logo tiene dos formas: una URL https —la imagen vive en el dominio del
|
|
33
|
+
* agente— o la imagen misma en base64. La segunda existe porque la primera
|
|
34
|
+
* pide un sitio donde alojar un archivo, que es justo lo que no tiene quien se
|
|
35
|
+
* registra desde la web. La referencia sigue siendo `src/lib/marca.ts` del
|
|
36
|
+
* marketplace: aquí solo hay que LEER igual, o un logo incrustado saldría
|
|
37
|
+
* recortado a 120 caracteres y con eso no se pinta nada.
|
|
38
|
+
*/
|
|
39
|
+
export const MAX_LOGO_DATA = 5000;
|
|
40
|
+
/**
|
|
41
|
+
* `data:image/webp;base64,…`. SVG queda fuera a propósito: es un documento con
|
|
42
|
+
* `<script>` dentro, y esta cadena la pinta cualquiera, no solo un `<img>`.
|
|
43
|
+
*/
|
|
44
|
+
const EMBEDDED_LOGO = /^data:image\/(png|webp|jpeg|gif);base64,([A-Za-z0-9+/]+={0,2})$/;
|
|
45
|
+
/** ¿Es una imagen incrustada válida en un token `logo:`? */
|
|
46
|
+
export function isEmbeddedLogo(value) {
|
|
47
|
+
if (value.length > MAX_LOGO_DATA)
|
|
48
|
+
return false;
|
|
49
|
+
const b64 = EMBEDDED_LOGO.exec(value)?.[2];
|
|
50
|
+
return b64 !== undefined && b64.length >= 64 && b64.length % 4 === 0;
|
|
51
|
+
}
|
|
29
52
|
/**
|
|
30
53
|
* Deja un valor de marca como se guarda, o vacío si no sirve.
|
|
31
54
|
*
|
|
@@ -34,7 +57,12 @@ const NO_LINKS = { logo: '', web: '', github: '', x: '', telegram: '' };
|
|
|
34
57
|
* `src/lib/marca.ts` del marketplace: si cambias una, cambia la otra.
|
|
35
58
|
*/
|
|
36
59
|
export function normalizeAgentLink(key, raw) {
|
|
37
|
-
const
|
|
60
|
+
const whole = raw.trim();
|
|
61
|
+
// Antes de recortar: una imagen incrustada mide miles de caracteres y el
|
|
62
|
+
// recorte la dejaría en un `data:` a medias — ocupa, se guarda y no se ve.
|
|
63
|
+
if (key === 'logo' && whole.startsWith('data:'))
|
|
64
|
+
return isEmbeddedLogo(whole) ? whole : '';
|
|
65
|
+
const value = whole.slice(0, 120);
|
|
38
66
|
if (!value)
|
|
39
67
|
return '';
|
|
40
68
|
// Un espacio o un `·` por dentro invalida en vez de borrarse: borrarlos
|