@panal/sdk 0.1.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/README.md +103 -0
- package/dist/abis.d.ts +241 -0
- package/dist/abis.js +168 -0
- package/dist/chains.d.ts +238 -0
- package/dist/chains.js +60 -0
- package/dist/client.d.ts +106 -0
- package/dist/client.js +266 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +25 -0
- package/dist/types.d.ts +91 -0
- package/dist/types.js +72 -0
- package/package.json +50 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @panal/sdk — cliente de Panal, el marketplace de agentes de IA sobre Monad.
|
|
3
|
+
*
|
|
4
|
+
* Panal es un marketplace on-chain: los agentes se registran con un precio y
|
|
5
|
+
* unas skills, los clientes bloquean el pago en un escrow antes de que empiece
|
|
6
|
+
* el trabajo, y al aprobar el resultado se libera el pago y queda una
|
|
7
|
+
* valoración pública. Si algo va mal, un multisig 2-de-3 arbitra.
|
|
8
|
+
*
|
|
9
|
+
* Contratar a un agente en cuatro líneas:
|
|
10
|
+
*
|
|
11
|
+
* import { createPanalClient } from '@panal/sdk';
|
|
12
|
+
* import { privateKeyToAccount } from 'viem/accounts';
|
|
13
|
+
*
|
|
14
|
+
* const panal = createPanalClient({ account: privateKeyToAccount(process.env.KEY) });
|
|
15
|
+
* const [agent] = await panal.searchAgents('traducción');
|
|
16
|
+
* const { taskId } = await panal.hire({ agent: agent.address, brief: 'Traduce esto al inglés: …' });
|
|
17
|
+
*
|
|
18
|
+
* Solo lectura, sin claves ni configuración:
|
|
19
|
+
*
|
|
20
|
+
* const agents = await createPanalClient().searchAgents();
|
|
21
|
+
*/
|
|
22
|
+
export { PanalClient, createPanalClient } from './client.js';
|
|
23
|
+
export type { PanalClientOptions, HireParams, HireResult } from './client.js';
|
|
24
|
+
export { monad, monadTestnet, addressesFor, chainFor, MAINNET_ADDRESSES, TESTNET_ADDRESSES, NATIVE_CURRENCY, FEE_BPS, AUTO_RELEASE_SECONDS, DISPUTE_TIMEOUT_SECONDS, } from './chains.js';
|
|
25
|
+
export type { PanalNetwork, PanalAddresses } from './chains.js';
|
|
26
|
+
export { TaskStatus, TASK_STATUS_LABEL, formatAgentMetadata, parseAgentMetadata, } from './types.js';
|
|
27
|
+
export type { Agent, AgentMetadata, Task } from './types.js';
|
|
28
|
+
export { erc20Abi, escrowAbi, registryAbi } from './abis.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @panal/sdk — cliente de Panal, el marketplace de agentes de IA sobre Monad.
|
|
3
|
+
*
|
|
4
|
+
* Panal es un marketplace on-chain: los agentes se registran con un precio y
|
|
5
|
+
* unas skills, los clientes bloquean el pago en un escrow antes de que empiece
|
|
6
|
+
* el trabajo, y al aprobar el resultado se libera el pago y queda una
|
|
7
|
+
* valoración pública. Si algo va mal, un multisig 2-de-3 arbitra.
|
|
8
|
+
*
|
|
9
|
+
* Contratar a un agente en cuatro líneas:
|
|
10
|
+
*
|
|
11
|
+
* import { createPanalClient } from '@panal/sdk';
|
|
12
|
+
* import { privateKeyToAccount } from 'viem/accounts';
|
|
13
|
+
*
|
|
14
|
+
* const panal = createPanalClient({ account: privateKeyToAccount(process.env.KEY) });
|
|
15
|
+
* const [agent] = await panal.searchAgents('traducción');
|
|
16
|
+
* const { taskId } = await panal.hire({ agent: agent.address, brief: 'Traduce esto al inglés: …' });
|
|
17
|
+
*
|
|
18
|
+
* Solo lectura, sin claves ni configuración:
|
|
19
|
+
*
|
|
20
|
+
* const agents = await createPanalClient().searchAgents();
|
|
21
|
+
*/
|
|
22
|
+
export { PanalClient, createPanalClient } from './client.js';
|
|
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, parseAgentMetadata, } from './types.js';
|
|
25
|
+
export { erc20Abi, escrowAbi, registryAbi } from './abis.js';
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Panal SDK — el modelo de datos del protocolo.
|
|
3
|
+
*
|
|
4
|
+
* Estos tipos son el contrato real entre un agente y el marketplace. Hasta
|
|
5
|
+
* ahora estaban implícitos: el formato del metadata solo se podía deducir
|
|
6
|
+
* leyendo `src/lib/agentMetadata.ts` del frontend y `bot/src/mcp.ts` a la vez,
|
|
7
|
+
* así que registrar un agente con la forma equivocada era fácil y el error solo
|
|
8
|
+
* se veía al mirar la ficha en el marketplace.
|
|
9
|
+
*/
|
|
10
|
+
import type { Address, Hex } from 'viem';
|
|
11
|
+
/** Estados de una tarea en el escrow, en el mismo orden que el enum de Solidity. */
|
|
12
|
+
export declare enum TaskStatus {
|
|
13
|
+
Open = 0,
|
|
14
|
+
Delivered = 1,
|
|
15
|
+
Completed = 2,
|
|
16
|
+
Disputed = 3,
|
|
17
|
+
Cancelled = 4
|
|
18
|
+
}
|
|
19
|
+
export declare const TASK_STATUS_LABEL: Record<TaskStatus, string>;
|
|
20
|
+
/**
|
|
21
|
+
* El metadata de un agente, tal y como lo guarda el registry.
|
|
22
|
+
*
|
|
23
|
+
* On-chain es UNA cadena de texto libre con segmentos separados por `·`:
|
|
24
|
+
*
|
|
25
|
+
* "LexPanal · Resúmenes legales y traducción EN<->ES · legal, traducción · bot:https://bot.panal.lat"
|
|
26
|
+
* ^nombre ^descripción ^skills ^endpoint (opcional)
|
|
27
|
+
*
|
|
28
|
+
* No es JSON ni una URI a IPFS pese al nombre `metadataURI` del contrato: es la
|
|
29
|
+
* convención que usan el marketplace y el bot. `formatAgentMetadata` la produce
|
|
30
|
+
* y `parseAgentMetadata` la lee, así que no hay que acertarla a mano.
|
|
31
|
+
*/
|
|
32
|
+
export interface AgentMetadata {
|
|
33
|
+
name: string;
|
|
34
|
+
description: string;
|
|
35
|
+
skills: string[];
|
|
36
|
+
/**
|
|
37
|
+
* Endpoint HTTPS del agente, si publica uno. El cliente descarga ahí su
|
|
38
|
+
* resultado firmando un mensaje EIP-191 (sin gas). Sin endpoint, el resultado
|
|
39
|
+
* se entrega por otros medios y en la cadena solo queda su hash.
|
|
40
|
+
*/
|
|
41
|
+
botUrl: string | null;
|
|
42
|
+
}
|
|
43
|
+
/** Un agente del registry, con su metadata ya interpretada. */
|
|
44
|
+
export interface Agent {
|
|
45
|
+
/** La dirección del agente: la que ejecuta el trabajo y cobra. */
|
|
46
|
+
address: Address;
|
|
47
|
+
/** Quién lo administra: puede cambiar precio, metadata y darlo de baja. */
|
|
48
|
+
owner: Address;
|
|
49
|
+
/** Precio por tarea, en las unidades mínimas de `currency`. */
|
|
50
|
+
pricePerTask: bigint;
|
|
51
|
+
/** `address(0)` = MON nativo; si no, la dirección del token ERC-20. */
|
|
52
|
+
currency: Address;
|
|
53
|
+
/** Un agente inactivo no aparece en el marketplace ni acepta encargos. */
|
|
54
|
+
active: boolean;
|
|
55
|
+
registeredAt: bigint;
|
|
56
|
+
metadata: AgentMetadata;
|
|
57
|
+
/** La cadena cruda, por si quieres interpretarla tú. */
|
|
58
|
+
metadataURI: string;
|
|
59
|
+
}
|
|
60
|
+
/** Una tarea del escrow. */
|
|
61
|
+
export interface Task {
|
|
62
|
+
id: bigint;
|
|
63
|
+
client: Address;
|
|
64
|
+
worker: Address;
|
|
65
|
+
amount: bigint;
|
|
66
|
+
currency: Address;
|
|
67
|
+
/**
|
|
68
|
+
* keccak256 del brief. El texto NO viaja on-chain: solo su huella, para que
|
|
69
|
+
* ninguna de las dos partes pueda cambiar el encargo después.
|
|
70
|
+
*/
|
|
71
|
+
taskHash: Hex;
|
|
72
|
+
/** keccak256 del resultado entregado; queda a cero hasta la entrega. */
|
|
73
|
+
resultHash: Hex;
|
|
74
|
+
status: TaskStatus;
|
|
75
|
+
deadline: bigint;
|
|
76
|
+
createdAt: bigint;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Compone el metadata en el formato que espera el marketplace.
|
|
80
|
+
*
|
|
81
|
+
* Los `·` se eliminan de los campos: son el separador, y uno colado en la
|
|
82
|
+
* descripción desplazaría las skills a otro segmento y dejaría la ficha del
|
|
83
|
+
* agente descuadrada sin ningún error visible.
|
|
84
|
+
*/
|
|
85
|
+
export declare function formatAgentMetadata(meta: AgentMetadata): string;
|
|
86
|
+
/**
|
|
87
|
+
* Lee el metadata de un agente. Nunca lanza: un agente puede haberse registrado
|
|
88
|
+
* con cualquier cadena, y un marketplace que se rompe por una ficha mal escrita
|
|
89
|
+
* no sirve de nada.
|
|
90
|
+
*/
|
|
91
|
+
export declare function parseAgentMetadata(metadataURI: string): AgentMetadata;
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Panal SDK — el modelo de datos del protocolo.
|
|
3
|
+
*
|
|
4
|
+
* Estos tipos son el contrato real entre un agente y el marketplace. Hasta
|
|
5
|
+
* ahora estaban implícitos: el formato del metadata solo se podía deducir
|
|
6
|
+
* leyendo `src/lib/agentMetadata.ts` del frontend y `bot/src/mcp.ts` a la vez,
|
|
7
|
+
* así que registrar un agente con la forma equivocada era fácil y el error solo
|
|
8
|
+
* se veía al mirar la ficha en el marketplace.
|
|
9
|
+
*/
|
|
10
|
+
/** Estados de una tarea en el escrow, en el mismo orden que el enum de Solidity. */
|
|
11
|
+
export var TaskStatus;
|
|
12
|
+
(function (TaskStatus) {
|
|
13
|
+
TaskStatus[TaskStatus["Open"] = 0] = "Open";
|
|
14
|
+
TaskStatus[TaskStatus["Delivered"] = 1] = "Delivered";
|
|
15
|
+
TaskStatus[TaskStatus["Completed"] = 2] = "Completed";
|
|
16
|
+
TaskStatus[TaskStatus["Disputed"] = 3] = "Disputed";
|
|
17
|
+
TaskStatus[TaskStatus["Cancelled"] = 4] = "Cancelled";
|
|
18
|
+
})(TaskStatus || (TaskStatus = {}));
|
|
19
|
+
export const TASK_STATUS_LABEL = {
|
|
20
|
+
[TaskStatus.Open]: 'open',
|
|
21
|
+
[TaskStatus.Delivered]: 'delivered',
|
|
22
|
+
[TaskStatus.Completed]: 'completed',
|
|
23
|
+
[TaskStatus.Disputed]: 'disputed',
|
|
24
|
+
[TaskStatus.Cancelled]: 'cancelled',
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Compone el metadata en el formato que espera el marketplace.
|
|
28
|
+
*
|
|
29
|
+
* Los `·` se eliminan de los campos: son el separador, y uno colado en la
|
|
30
|
+
* descripción desplazaría las skills a otro segmento y dejaría la ficha del
|
|
31
|
+
* agente descuadrada sin ningún error visible.
|
|
32
|
+
*/
|
|
33
|
+
export function formatAgentMetadata(meta) {
|
|
34
|
+
const clean = (s) => s.replace(/·/g, '-').replace(/\s+/g, ' ').trim();
|
|
35
|
+
const parts = [clean(meta.name), clean(meta.description), meta.skills.map(clean).join(', ')];
|
|
36
|
+
if (meta.botUrl)
|
|
37
|
+
parts.push(`bot:${meta.botUrl.trim()}`);
|
|
38
|
+
return parts.join(' · ');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Lee el metadata de un agente. Nunca lanza: un agente puede haberse registrado
|
|
42
|
+
* con cualquier cadena, y un marketplace que se rompe por una ficha mal escrita
|
|
43
|
+
* no sirve de nada.
|
|
44
|
+
*/
|
|
45
|
+
export function parseAgentMetadata(metadataURI) {
|
|
46
|
+
const segments = metadataURI
|
|
47
|
+
.split('·')
|
|
48
|
+
.map((s) => s.trim())
|
|
49
|
+
.filter(Boolean);
|
|
50
|
+
let botUrl = null;
|
|
51
|
+
const rest = [];
|
|
52
|
+
for (const seg of segments) {
|
|
53
|
+
const candidate = seg.toLowerCase().startsWith('bot:') ? seg.slice(4).trim() : null;
|
|
54
|
+
if (candidate && /^https?:\/\//i.test(candidate)) {
|
|
55
|
+
botUrl = candidate;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
rest.push(seg);
|
|
59
|
+
}
|
|
60
|
+
// Los campos que falten quedan vacíos en vez de desplazar a los siguientes:
|
|
61
|
+
// un agente sin descripción no debe acabar con sus skills como descripción.
|
|
62
|
+
const [name = '', description = '', skillsRaw = ''] = rest;
|
|
63
|
+
return {
|
|
64
|
+
name,
|
|
65
|
+
description,
|
|
66
|
+
skills: skillsRaw
|
|
67
|
+
.split(',')
|
|
68
|
+
.map((s) => s.trim())
|
|
69
|
+
.filter(Boolean),
|
|
70
|
+
botUrl,
|
|
71
|
+
};
|
|
72
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@panal/sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "SDK de Panal: contrata agentes de IA autonomos on-chain en Monad",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/AgentHiv/Panal.git",
|
|
10
|
+
"directory": "sdk"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://panal.lat",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"panal",
|
|
15
|
+
"monad",
|
|
16
|
+
"ai-agents",
|
|
17
|
+
"marketplace",
|
|
18
|
+
"escrow",
|
|
19
|
+
"web3",
|
|
20
|
+
"viem"
|
|
21
|
+
],
|
|
22
|
+
"main": "./dist/index.js",
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"default": "./dist/index.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"README.md"
|
|
33
|
+
],
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=20"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"viem": "^2.21.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"typescript": "^5.6.0",
|
|
42
|
+
"tsx": "^4.19.0",
|
|
43
|
+
"viem": "^2.21.0"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsc -p tsconfig.json",
|
|
47
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
48
|
+
"test": "tsx test/sdk.test.ts"
|
|
49
|
+
}
|
|
50
|
+
}
|