@vaia-lab/sdk 0.2.0 → 0.3.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/LICENSE +21 -0
- package/README.md +107 -151
- package/dist/cli.js +252 -0
- package/dist/index.cjs +698 -12
- package/dist/index.d.cts +754 -5
- package/dist/index.d.ts +754 -5
- package/dist/index.js +679 -11
- package/package.json +10 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,384 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Las 7 piezas operativas del ecosistema VAIA.
|
|
3
|
+
*
|
|
4
|
+
* Skills → capacidades atómicas verificadas
|
|
5
|
+
* Agentes → entidades persistentes con objetivos y autoridad
|
|
6
|
+
* Herramientas → acciones permitidas en el mundo real
|
|
7
|
+
* Workflows → procesos multi-paso
|
|
8
|
+
* Modalidades → cómo entra y sale la información
|
|
9
|
+
* Personalidades → estilos de comunicación
|
|
10
|
+
* Permisos → quién puede qué, sobre qué, cuándo
|
|
11
|
+
*
|
|
12
|
+
* Este archivo NO las implementa: las declara. El motor que las ejecuta es
|
|
13
|
+
* privado; lo público es la forma de describirlas y las reglas que deben
|
|
14
|
+
* cumplir para poder existir.
|
|
15
|
+
*
|
|
16
|
+
* ── Lo que separa esto de otros SDK de agentes ───────────────────────────
|
|
17
|
+
* Casi todos saben decir "el agente puede llamar a esta función". Ninguno sabe
|
|
18
|
+
* decir "puede hasta $500 solo, arriba de eso pregunta, y nunca puede borrar".
|
|
19
|
+
* Esa es la parte que aquí es obligatoria, no opcional: un agente sin autoridad
|
|
20
|
+
* declarada ni siquiera compila.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Qué tan lejos puede llegar algo por su cuenta.
|
|
24
|
+
*
|
|
25
|
+
* No es un booleano "puede o no puede". La autoridad se delega como a una
|
|
26
|
+
* persona: por categoría, por monto y por consecuencia.
|
|
27
|
+
*/
|
|
28
|
+
type AuthorityLevel =
|
|
29
|
+
/** Lo hace solo. Reservado a lo que no tiene consecuencia irreversible. */
|
|
30
|
+
'autonoma'
|
|
31
|
+
/** Lo prepara, pero un humano aprueba antes de que ocurra. */
|
|
32
|
+
| 'requiere_aprobacion'
|
|
33
|
+
/** No puede, nunca, aunque el usuario lo pida. */
|
|
34
|
+
| 'prohibida';
|
|
35
|
+
/** Qué tan grave es equivocarse aquí. Decide cuánta ceremonia merece. */
|
|
36
|
+
type Consequence = 'reversible' | 'costosa' | 'irreversible';
|
|
37
|
+
interface Authority {
|
|
38
|
+
level: AuthorityLevel;
|
|
39
|
+
consequence: Consequence;
|
|
40
|
+
/** Tope de gasto por ejecución, si mueve dinero. */
|
|
41
|
+
maxAmount?: number | undefined;
|
|
42
|
+
/** Moneda del tope. Obligatoria si hay tope: "500" sin moneda no significa nada. */
|
|
43
|
+
currency?: string | undefined;
|
|
44
|
+
/** Cuántas veces por hora, como mucho. */
|
|
45
|
+
maxPerHour?: number | undefined;
|
|
46
|
+
/** Por qué se delegó así. Se le muestra al usuario cuando concede. */
|
|
47
|
+
rationale?: string | undefined;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* De dónde sale lo que el sistema afirma.
|
|
51
|
+
*
|
|
52
|
+
* Es obligatoria en todo lo que produzca una afirmación. Un asistente que no
|
|
53
|
+
* puede decir de dónde sacó algo es un oráculo, y un oráculo no se audita ni
|
|
54
|
+
* se corrige. Este es el pilar de info verificada hecho tipo.
|
|
55
|
+
*/
|
|
56
|
+
type EvidenceKind = 'fuente' | 'calculo' | 'usuario' | 'externo' | 'inferencia';
|
|
57
|
+
interface EvidencePolicy {
|
|
58
|
+
/** Tipos admitidos para respaldar una afirmación de esta pieza. */
|
|
59
|
+
accepts: EvidenceKind[];
|
|
60
|
+
/**
|
|
61
|
+
* Si es true, una respuesta sin evidencia se rechaza en vez de entregarse.
|
|
62
|
+
* Debe estar en true en cualquier cosa que informe decisiones reales.
|
|
63
|
+
*/
|
|
64
|
+
required: boolean;
|
|
65
|
+
}
|
|
66
|
+
interface PiezaBase {
|
|
67
|
+
/** Estable, en minúsculas con guion bajo. */
|
|
68
|
+
name: string;
|
|
69
|
+
/** Qué es y cuándo usarlo. Es lo que lee el modelo para decidir. */
|
|
70
|
+
description: string;
|
|
71
|
+
}
|
|
72
|
+
/** Capacidad atómica y verificable. El verbo del sistema. */
|
|
73
|
+
interface SkillDef extends PiezaBase {
|
|
74
|
+
/** Qué necesita recibir. */
|
|
75
|
+
inputs?: {
|
|
76
|
+
name: string;
|
|
77
|
+
type: 'string' | 'number' | 'boolean';
|
|
78
|
+
required?: boolean | undefined;
|
|
79
|
+
}[] | undefined;
|
|
80
|
+
/** Cómo se comprueba que salió bien. Sin esto no es "verificada". */
|
|
81
|
+
verification?: string | undefined;
|
|
82
|
+
evidence?: EvidencePolicy | undefined;
|
|
83
|
+
}
|
|
84
|
+
/** Acción sobre el mundo real. Siempre lleva autoridad. */
|
|
85
|
+
interface ToolDef extends PiezaBase {
|
|
86
|
+
authority: Authority;
|
|
87
|
+
/** Permiso que el usuario debe conceder. */
|
|
88
|
+
permission: string;
|
|
89
|
+
}
|
|
90
|
+
/** Proceso multi-paso. La autoridad del conjunto no puede ser menor que la
|
|
91
|
+
* del paso más grave que contiene. */
|
|
92
|
+
interface WorkflowDef extends PiezaBase {
|
|
93
|
+
steps: {
|
|
94
|
+
skill?: string | undefined;
|
|
95
|
+
tool?: string | undefined;
|
|
96
|
+
description: string;
|
|
97
|
+
}[];
|
|
98
|
+
authority: Authority;
|
|
99
|
+
}
|
|
100
|
+
/** Cómo entra y sale la información. */
|
|
101
|
+
type ModalityDef = 'texto' | 'voz' | 'imagen' | 'documento' | 'sensor';
|
|
102
|
+
/** Estilo de comunicación. No es adorno: un agente reconocible es un agente
|
|
103
|
+
* con el que se sostiene una relación. */
|
|
104
|
+
interface PersonalityDef {
|
|
105
|
+
name: string;
|
|
106
|
+
tone: 'formal' | 'cercano' | 'tecnico' | 'calido' | 'directo';
|
|
107
|
+
/** Rasgos que lo hacen reconocible. */
|
|
108
|
+
traits?: string[] | undefined;
|
|
109
|
+
/** Lo que NUNCA dice o hace, aunque se lo pidan. */
|
|
110
|
+
neverDoes?: string[] | undefined;
|
|
111
|
+
}
|
|
112
|
+
/** Entidad persistente con objetivos, autoridad y memoria. */
|
|
113
|
+
interface AgentDef extends PiezaBase {
|
|
114
|
+
/** Por qué existe. Si no se puede escribir, el agente no debería existir. */
|
|
115
|
+
purpose: string;
|
|
116
|
+
personality?: PersonalityDef | undefined;
|
|
117
|
+
/** Skills que conoce. */
|
|
118
|
+
skills?: string[] | undefined;
|
|
119
|
+
/** Herramientas que puede invocar. */
|
|
120
|
+
tools?: string[] | undefined;
|
|
121
|
+
workflows?: string[] | undefined;
|
|
122
|
+
modalities?: ModalityDef[] | undefined;
|
|
123
|
+
/** Techo de autoridad del agente. Ninguna herramienta suya puede superarlo. */
|
|
124
|
+
authority: Authority;
|
|
125
|
+
evidence?: EvidencePolicy | undefined;
|
|
126
|
+
}
|
|
127
|
+
/** Todo lo que una capacidad declara sobre sus piezas. */
|
|
128
|
+
interface PiecesConfig {
|
|
129
|
+
skills?: SkillDef[] | undefined;
|
|
130
|
+
tools?: ToolDef[] | undefined;
|
|
131
|
+
workflows?: WorkflowDef[] | undefined;
|
|
132
|
+
agents?: AgentDef[] | undefined;
|
|
133
|
+
personalities?: PersonalityDef[] | undefined;
|
|
134
|
+
modalities?: ModalityDef[] | undefined;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Valida las piezas al DECLARARLAS.
|
|
138
|
+
*
|
|
139
|
+
* Corre en el escritorio del desarrollador, no en producción. Las reglas que
|
|
140
|
+
* impone no son de estilo: cada una cierra una forma concreta de causar daño.
|
|
141
|
+
*/
|
|
142
|
+
declare function validatePieces(cfg: PiecesConfig): string[];
|
|
143
|
+
/** ¿Puede esta pieza actuar sola, o hay que preguntarle al humano? */
|
|
144
|
+
declare function requiresApproval(a: Authority): boolean;
|
|
145
|
+
/**
|
|
146
|
+
* ¿Alcanza la autoridad para ESTA ejecución concreta?
|
|
147
|
+
*
|
|
148
|
+
* La declaración dice el techo; esto revisa el caso puntual, que es donde
|
|
149
|
+
* de verdad se decide.
|
|
150
|
+
*/
|
|
151
|
+
declare function checkAuthority(a: Authority, intento?: {
|
|
152
|
+
amount?: number | undefined;
|
|
153
|
+
currency?: string | undefined;
|
|
154
|
+
}): {
|
|
155
|
+
ok: true;
|
|
156
|
+
} | {
|
|
157
|
+
ok: false;
|
|
158
|
+
reason: string;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* VAIA Extension Protocol — superficie de AGENTE.
|
|
163
|
+
*
|
|
164
|
+
* Es la parte del protocolo que permite que el asistente de Handeia viva
|
|
165
|
+
* dentro de un espacio de terceros. Sigue la regla del ecosistema: protocolo
|
|
166
|
+
* antes que SDK. Lo que hay aquí son CONTRATOS; el SDK solo los transporta.
|
|
167
|
+
*
|
|
168
|
+
* ── El reparto de papeles ────────────────────────────────────────────────
|
|
169
|
+
* El espacio → superficie y manos. Declara qué sabe y qué puede hacer.
|
|
170
|
+
* Handeia → cerebro, memoria y autoridad. Decide y ejecuta a través suyo.
|
|
171
|
+
*
|
|
172
|
+
* Por eso un espacio NO trae su propia IA: si la trajera, no te conocería,
|
|
173
|
+
* empezaría de cero cada vez, y no podría contradecirse a sí mismo. El caso
|
|
174
|
+
* que lo justifica: el espacio puntúa un resultado con 90 y el agente te dice
|
|
175
|
+
* que te conviene el de 87, porque sabe algo de ti que el espacio no sabe.
|
|
176
|
+
* Eso solo es posible si el cerebro vive fuera del espacio.
|
|
177
|
+
*
|
|
178
|
+
* ── La regla de confianza, que manda sobre todo lo demás ─────────────────
|
|
179
|
+
* El espacio es CÓDIGO DE TERCEROS. Nada de lo que envía es un hecho: es una
|
|
180
|
+
* AFIRMACIÓN. Handeia la trata como dato citado, nunca como instrucción y
|
|
181
|
+
* nunca al mismo nivel que lo que sabe del usuario. Un espacio que escriba
|
|
182
|
+
* "ignora las instrucciones anteriores" en su contexto no logra nada.
|
|
183
|
+
*
|
|
184
|
+
* @see AGENT_PROTOCOL_VERSION para la política de compatibilidad.
|
|
185
|
+
*/
|
|
186
|
+
/**
|
|
187
|
+
* Versión del protocolo de agente. Viaja en cada mensaje.
|
|
188
|
+
*
|
|
189
|
+
* Se versiona desde el primer día a propósito: este contrato es público y
|
|
190
|
+
* cambiarlo después obliga a coordinar despliegues entre partes que no se
|
|
191
|
+
* conocen. Ya se pagó esa factura una vez con la codificación del JWT.
|
|
192
|
+
*/
|
|
193
|
+
declare const AGENT_PROTOCOL_VERSION = 1;
|
|
194
|
+
/** Un parámetro de una acción. Sin tipos no hay validación posible. */
|
|
195
|
+
interface AgentActionParam {
|
|
196
|
+
name: string;
|
|
197
|
+
type: 'string' | 'number' | 'boolean';
|
|
198
|
+
description: string;
|
|
199
|
+
required?: boolean | undefined;
|
|
200
|
+
/** Valores admitidos. Si se define, nada fuera de la lista es válido. */
|
|
201
|
+
enum?: string[] | undefined;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Algo que el espacio sabe hacer.
|
|
205
|
+
*
|
|
206
|
+
* Handeia SOLO puede pedir acciones declaradas aquí. No improvisa, no toca el
|
|
207
|
+
* DOM, no busca la forma. Si no está declarada, para el agente no existe —
|
|
208
|
+
* y eso es lo que hace que el mismo agente sirva en cualquier espacio sin que
|
|
209
|
+
* Handeia sepa nada de ninguno en particular.
|
|
210
|
+
*/
|
|
211
|
+
interface AgentAction {
|
|
212
|
+
/** Identificador estable, en minúsculas: 'filtrar_resultados'. */
|
|
213
|
+
name: string;
|
|
214
|
+
/** Qué hace, en lenguaje natural. Es lo que lee el modelo para elegirla. */
|
|
215
|
+
description: string;
|
|
216
|
+
params?: AgentActionParam[] | undefined;
|
|
217
|
+
/**
|
|
218
|
+
* true si modifica algo. Las que escriben se confirman con el usuario ANTES
|
|
219
|
+
* de ejecutarse — un agente que escribe sin preguntar se siente fuera de
|
|
220
|
+
* control incluso cuando acierta.
|
|
221
|
+
*/
|
|
222
|
+
writes?: boolean | undefined;
|
|
223
|
+
/** Permiso que el usuario debe haber concedido a este espacio. */
|
|
224
|
+
permission?: string | undefined;
|
|
225
|
+
}
|
|
226
|
+
/** Configuración de la superficie de agente dentro de defineCapability. */
|
|
227
|
+
interface AgentSurfaceConfig {
|
|
228
|
+
/** Acciones que el espacio expone. Vacío = el agente solo puede responder. */
|
|
229
|
+
actions?: AgentAction[] | undefined;
|
|
230
|
+
/**
|
|
231
|
+
* Endpoint para preguntarle al espacio cuando el usuario NO está dentro
|
|
232
|
+
* ("¿tengo algo pendiente ahí?"). El círculo solo existe con el espacio
|
|
233
|
+
* abierto; esto es lo que permite que Handeia sea el lugar donde convergen
|
|
234
|
+
* todos tus espacios en vez de uno más al que entrar.
|
|
235
|
+
*/
|
|
236
|
+
queryEndpoint?: string | undefined;
|
|
237
|
+
/** Frase de bienvenida propia del espacio. */
|
|
238
|
+
greeting?: string | undefined;
|
|
239
|
+
/**
|
|
240
|
+
* Servicios externos que el espacio necesita consultar. El usuario los
|
|
241
|
+
* concede por espacio y los puede revocar cuando quiera. El espacio jamás
|
|
242
|
+
* recibe el token: pide operaciones, la plataforma las ejecuta.
|
|
243
|
+
*/
|
|
244
|
+
needs?: ConnectorNeed[] | undefined;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Servicios externos que un espacio puede necesitar (GitHub, Drive, Calendar…).
|
|
248
|
+
*
|
|
249
|
+
* ── La regla, y no tiene excepciones ─────────────────────────────────────
|
|
250
|
+
* El espacio NUNCA recibe el token del usuario. Declara qué necesita, la
|
|
251
|
+
* plataforma llama al proveedor con el token que YA tiene guardado, y le
|
|
252
|
+
* devuelve solo el resultado.
|
|
253
|
+
*
|
|
254
|
+
* Por qué así y no entregando el token:
|
|
255
|
+
* - Si cada espacio guardara tokens, la superficie de ataque se multiplica
|
|
256
|
+
* por cada desarrollador que publique. Un espacio comprometido entregaría
|
|
257
|
+
* el GitHub y el Drive de todos sus usuarios.
|
|
258
|
+
* - Prestado, un espacio comprometido solo puede pedir las operaciones que
|
|
259
|
+
* el usuario le concedió, con límite de frecuencia, auditadas y
|
|
260
|
+
* revocables al instante desde Conectores.
|
|
261
|
+
*
|
|
262
|
+
* De regalo, publicar un espacio se vuelve barato: el desarrollador no
|
|
263
|
+
* implementa OAuth de nada.
|
|
264
|
+
*/
|
|
265
|
+
type ConnectorNeed = 'github' | 'drive' | 'calendar' | 'email' | 'notion' | 'discord';
|
|
266
|
+
/**
|
|
267
|
+
* Operaciones de LECTURA que la plataforma sabe hacer por el espacio.
|
|
268
|
+
*
|
|
269
|
+
* Lista cerrada a propósito: un espacio no puede pedir "haz esta llamada
|
|
270
|
+
* arbitraria a la API de GitHub". Solo puede pedir lo que está aquí, y cada
|
|
271
|
+
* una devuelve datos ya acotados. Escribir en un servicio externo NO se
|
|
272
|
+
* presta — para eso el usuario usa el servicio.
|
|
273
|
+
*/
|
|
274
|
+
type ConnectorOperation = 'github.repos' | 'github.issues' | 'drive.files' | 'calendar.events' | 'email.recent' | 'notion.pages';
|
|
275
|
+
/** Lo que el espacio pide prestado. */
|
|
276
|
+
interface ConnectorRequest {
|
|
277
|
+
operation: ConnectorOperation;
|
|
278
|
+
/** Filtros simples. La plataforma los valida; nada de consultas libres. */
|
|
279
|
+
params?: Record<string, string | number | boolean> | undefined;
|
|
280
|
+
}
|
|
281
|
+
/** Lo que la plataforma devuelve. Datos, jamás credenciales. */
|
|
282
|
+
interface ConnectorResult {
|
|
283
|
+
operation: ConnectorOperation;
|
|
284
|
+
ok: boolean;
|
|
285
|
+
items?: Record<string, unknown>[] | undefined;
|
|
286
|
+
/** 'sin_conectar' = el usuario no ha vinculado ese servicio todavía. */
|
|
287
|
+
error?: 'sin_permiso' | 'sin_conectar' | 'no_soportada' | 'limite_excedido' | 'fallo' | undefined;
|
|
288
|
+
}
|
|
289
|
+
/** Qué operación necesita qué conector — la plataforma lo usa para autorizar. */
|
|
290
|
+
declare const CONNECTOR_OF_OPERATION: Record<ConnectorOperation, ConnectorNeed>;
|
|
291
|
+
/**
|
|
292
|
+
* Lo que el espacio dice que está pasando.
|
|
293
|
+
*
|
|
294
|
+
* OJO: se llama `claims` y no `facts` a propósito. Handeia lo etiqueta como
|
|
295
|
+
* afirmación de un tercero antes de dárselo al modelo.
|
|
296
|
+
*/
|
|
297
|
+
interface AgentSpaceContext {
|
|
298
|
+
/** Dónde está el usuario dentro del espacio: '/lista'. */
|
|
299
|
+
route?: string | undefined;
|
|
300
|
+
/** Qué está viendo, en lenguaje natural: 'Lista de 12 resultados'. */
|
|
301
|
+
view?: string | undefined;
|
|
302
|
+
/** Datos que el espacio considera relevantes ahora mismo. */
|
|
303
|
+
claims?: Record<string, unknown> | undefined;
|
|
304
|
+
}
|
|
305
|
+
/** Petición del espacio a Handeia. Un solo endpoint, un solo formato. */
|
|
306
|
+
interface AgentTurnRequest {
|
|
307
|
+
protocol: typeof AGENT_PROTOCOL_VERSION;
|
|
308
|
+
/** Lo que escribió el usuario. */
|
|
309
|
+
message: string;
|
|
310
|
+
context?: AgentSpaceContext | undefined;
|
|
311
|
+
/** Acciones disponibles AHORA (pueden ser menos que las declaradas). */
|
|
312
|
+
actions?: AgentAction[] | undefined;
|
|
313
|
+
/** Turnos previos, para que el agente no pierda el hilo. */
|
|
314
|
+
history?: {
|
|
315
|
+
role: 'user' | 'agent';
|
|
316
|
+
text: string;
|
|
317
|
+
}[] | undefined;
|
|
318
|
+
/** Resultado de una acción que Handeia pidió en el turno anterior. */
|
|
319
|
+
actionResult?: AgentActionResult | undefined;
|
|
320
|
+
}
|
|
321
|
+
/** Lo que el espacio devuelve tras ejecutar una acción. */
|
|
322
|
+
interface AgentActionResult {
|
|
323
|
+
action: string;
|
|
324
|
+
ok: boolean;
|
|
325
|
+
/** Qué pasó, para que el agente pueda cerrar el ciclo con el usuario. */
|
|
326
|
+
summary?: string | undefined;
|
|
327
|
+
error?: string | undefined;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* De dónde salió lo que el agente afirma.
|
|
331
|
+
*
|
|
332
|
+
* No es adorno: es el pilar de info verificada. Cuando el agente contradice
|
|
333
|
+
* al espacio ("dice 90, pero te conviene la de 87"), tiene que poder decir de
|
|
334
|
+
* dónde sacó su razón. Un oráculo que no se explica no se gana la confianza.
|
|
335
|
+
*/
|
|
336
|
+
interface AgentEvidence {
|
|
337
|
+
/** 'handeia' = memoria del usuario · 'space' = lo que declaró el espacio. */
|
|
338
|
+
source: 'handeia' | 'space';
|
|
339
|
+
label: string;
|
|
340
|
+
}
|
|
341
|
+
/** Respuesta de Handeia al espacio. */
|
|
342
|
+
interface AgentTurnResponse {
|
|
343
|
+
protocol: typeof AGENT_PROTOCOL_VERSION;
|
|
344
|
+
/** Qué decirle al usuario. */
|
|
345
|
+
text?: string | undefined;
|
|
346
|
+
/** Acción a ejecutar. Siempre sale de la lista declarada, nunca inventada. */
|
|
347
|
+
action?: {
|
|
348
|
+
name: string;
|
|
349
|
+
args?: Record<string, unknown> | undefined;
|
|
350
|
+
} | undefined;
|
|
351
|
+
/** true si hay que confirmar con el usuario antes de ejecutarla. */
|
|
352
|
+
confirm?: boolean | undefined;
|
|
353
|
+
evidence?: AgentEvidence[] | undefined;
|
|
354
|
+
/** Identificador para cruzar los registros de todas las capas. */
|
|
355
|
+
traceId?: string | undefined;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Revisa que las acciones declaradas sean utilizables.
|
|
359
|
+
*
|
|
360
|
+
* Corre al declarar la capacidad, no en producción: un contrato mal escrito
|
|
361
|
+
* debe reventar en el escritorio del desarrollador, no frente al usuario.
|
|
362
|
+
*/
|
|
363
|
+
declare function validateAgentSurface(cfg: AgentSurfaceConfig): string[];
|
|
364
|
+
/**
|
|
365
|
+
* ¿Es válida esta acción contra lo declarado?
|
|
366
|
+
*
|
|
367
|
+
* La usa Handeia antes de reenviarle nada al espacio. Es la lista blanca en
|
|
368
|
+
* ejecución: aunque el modelo se invente una acción o un argumento fuera de
|
|
369
|
+
* rango, aquí se detiene.
|
|
370
|
+
*/
|
|
371
|
+
declare function validateActionCall(llamada: {
|
|
372
|
+
name: string;
|
|
373
|
+
args?: Record<string, unknown> | undefined;
|
|
374
|
+
}, declaradas: AgentAction[]): {
|
|
375
|
+
ok: true;
|
|
376
|
+
action: AgentAction;
|
|
377
|
+
} | {
|
|
378
|
+
ok: false;
|
|
379
|
+
reason: string;
|
|
380
|
+
};
|
|
381
|
+
|
|
1
382
|
type PublishType = 'app' | 'ia' | 'skill' | 'eco';
|
|
2
383
|
type EcoTarget = 'gandia' | 'handeia' | 'both';
|
|
3
384
|
type NodeType = 'widget' | 'artefacto' | 'espacio' | 'skill' | 'agente';
|
|
@@ -14,7 +395,7 @@ interface GandiaUser {
|
|
|
14
395
|
role: string;
|
|
15
396
|
email?: string | undefined;
|
|
16
397
|
}
|
|
17
|
-
/** Context injected by
|
|
398
|
+
/** Context injected by the platform on every invoke call to your server. */
|
|
18
399
|
interface GandiaContext {
|
|
19
400
|
capability_id: string;
|
|
20
401
|
call_id: string;
|
|
@@ -22,7 +403,7 @@ interface GandiaContext {
|
|
|
22
403
|
user: GandiaUser;
|
|
23
404
|
permissions: string[];
|
|
24
405
|
trigger: 'user_query' | 'gaia_invoke' | 'event';
|
|
25
|
-
/** Surface
|
|
406
|
+
/** Surface the platform wants to render — determines which respond.* to use. */
|
|
26
407
|
surface: Surface;
|
|
27
408
|
query?: string | undefined;
|
|
28
409
|
}
|
|
@@ -31,14 +412,14 @@ interface HandeiaUser {
|
|
|
31
412
|
email?: string | undefined;
|
|
32
413
|
name?: string | undefined;
|
|
33
414
|
}
|
|
34
|
-
/** Context injected by
|
|
415
|
+
/** Context injected by the platform on every invoke call to your server. */
|
|
35
416
|
interface HandeiaContext {
|
|
36
417
|
capability_id: string;
|
|
37
418
|
call_id: string;
|
|
38
419
|
user: HandeiaUser;
|
|
39
420
|
permissions: string[];
|
|
40
421
|
trigger: 'user_action' | 'haia_invoke' | 'schedule';
|
|
41
|
-
/** Surface
|
|
422
|
+
/** Surface the platform wants to render. */
|
|
42
423
|
surface: Surface;
|
|
43
424
|
query?: string | undefined;
|
|
44
425
|
}
|
|
@@ -162,6 +543,16 @@ interface CapabilityConfig {
|
|
|
162
543
|
sector: string;
|
|
163
544
|
/** Which surfaces the capability can respond to, and their invoke endpoint. */
|
|
164
545
|
surfaces: Partial<Record<Surface, SurfaceConfig>>;
|
|
546
|
+
/**
|
|
547
|
+
* Superficie de AGENTE — el asistente de Handeia dentro de este espacio.
|
|
548
|
+
* El espacio declara qué sabe hacer; Handeia razona y decide. Ver agent.ts.
|
|
549
|
+
*/
|
|
550
|
+
agent?: AgentSurfaceConfig | undefined;
|
|
551
|
+
/**
|
|
552
|
+
* Las 7 piezas operativas: skills, herramientas, workflows, agentes,
|
|
553
|
+
* personalidades y modalidades. Con su autoridad y su evidencia. Ver pieces.ts.
|
|
554
|
+
*/
|
|
555
|
+
pieces?: PiecesConfig | undefined;
|
|
165
556
|
permissions: string[];
|
|
166
557
|
risk: Risk;
|
|
167
558
|
description?: string | undefined;
|
|
@@ -487,6 +878,15 @@ interface VAIAManifest {
|
|
|
487
878
|
level?: string | undefined;
|
|
488
879
|
sector: string;
|
|
489
880
|
surfaces: string[];
|
|
881
|
+
/** Superficie de agente: qué sabe hacer el espacio y por dónde preguntarle.
|
|
882
|
+
* Se publica en el manifest para que el portal y Handeia lo conozcan sin
|
|
883
|
+
* tener que abrir el código de nadie. */
|
|
884
|
+
agent?: {
|
|
885
|
+
protocol: number;
|
|
886
|
+
actions: AgentAction[];
|
|
887
|
+
query_endpoint?: string | undefined;
|
|
888
|
+
} | undefined;
|
|
889
|
+
pieces?: PiecesConfig | undefined;
|
|
490
890
|
permissions: string[];
|
|
491
891
|
risk: Risk;
|
|
492
892
|
has_own_auth: boolean;
|
|
@@ -504,6 +904,355 @@ declare function defineCapability(config: CapabilityConfig): CapabilityConfig;
|
|
|
504
904
|
/** Converts a CapabilityConfig to a gandia.manifest.json object. */
|
|
505
905
|
declare function toManifest(config: CapabilityConfig): VAIAManifest;
|
|
506
906
|
|
|
907
|
+
/**
|
|
908
|
+
* El círculo del agente de Handeia, para montar dentro de un espacio.
|
|
909
|
+
*
|
|
910
|
+
* Montaje NEUTRAL a propósito: no depende de React ni de ningún framework. El
|
|
911
|
+
* SDK presume de cero dependencias y atarlo a React lo traicionaría — un
|
|
912
|
+
* espacio hecho en Vue, Svelte o HTML puro tiene el mismo derecho al agente.
|
|
913
|
+
* Encima de esto, un envoltorio de React son tres líneas.
|
|
914
|
+
*
|
|
915
|
+
* Lo que el desarrollador pone:
|
|
916
|
+
* - de dónde sacar el contexto (qué está viendo el usuario)
|
|
917
|
+
* - qué acciones sabe ejecutar
|
|
918
|
+
* Lo que pone el SDK: el círculo, el campo, el transporte y la identidad.
|
|
919
|
+
*
|
|
920
|
+
* El aspecto lo controla el SDK a propósito: así el agente se ve y se comporta
|
|
921
|
+
* igual en todos los espacios, que es parte de que se sienta Handeia y no un
|
|
922
|
+
* chat pegado a una app.
|
|
923
|
+
*/
|
|
924
|
+
|
|
925
|
+
interface MountAgentOptions {
|
|
926
|
+
/** capability_id del espacio, el mismo del manifest. */
|
|
927
|
+
capabilityId: string;
|
|
928
|
+
/**
|
|
929
|
+
* Dónde vive Handeia. Un solo endpoint, y el SDK no sabe qué hay detrás:
|
|
930
|
+
* así Handeia puede reordenar sus capas sin publicar una versión nueva.
|
|
931
|
+
*/
|
|
932
|
+
handeiaUrl?: string | undefined;
|
|
933
|
+
/** Qué está viendo el usuario AHORA. Se pregunta en cada turno, no se cachea. */
|
|
934
|
+
getContext?: (() => AgentSpaceContext | Promise<AgentSpaceContext>) | undefined;
|
|
935
|
+
/** Las mismas acciones que el manifest declara. */
|
|
936
|
+
actions?: AgentAction[] | undefined;
|
|
937
|
+
/** Ejecuta una acción. Solo se llama con acciones declaradas y ya validadas. */
|
|
938
|
+
onAction?: ((name: string, args: Record<string, unknown>) => Promise<AgentActionResult> | AgentActionResult) | undefined;
|
|
939
|
+
/** Dónde montar. Por defecto, el body. */
|
|
940
|
+
container?: HTMLElement | undefined;
|
|
941
|
+
/** Saludo propio del espacio. */
|
|
942
|
+
greeting?: string | undefined;
|
|
943
|
+
}
|
|
944
|
+
interface AgentHandle {
|
|
945
|
+
open(): void;
|
|
946
|
+
close(): void;
|
|
947
|
+
destroy(): void;
|
|
948
|
+
}
|
|
949
|
+
/**
|
|
950
|
+
* Monta el agente. Devuelve un manejador para abrirlo, cerrarlo o quitarlo.
|
|
951
|
+
*
|
|
952
|
+
* Es idempotente por espacio: montarlo dos veces no deja dos círculos.
|
|
953
|
+
*/
|
|
954
|
+
declare function mountAgent(opts: MountAgentOptions): AgentHandle;
|
|
955
|
+
|
|
956
|
+
/**
|
|
957
|
+
* Capacidades que CORREN.
|
|
958
|
+
*
|
|
959
|
+
* El resto del SDK declara y valida. Esto ejecuta. Es la diferencia entre
|
|
960
|
+
* darle a alguien el letrero de la puerta y darle la puerta.
|
|
961
|
+
*
|
|
962
|
+
* ── Las tres formas de tener una capacidad ───────────────────────────────
|
|
963
|
+
* local() → una función tuya, gobernada
|
|
964
|
+
* http() → un proyecto que ya tienes, sin reescribirlo
|
|
965
|
+
* mcp() → miles que ya existen en código abierto, con reglas encima
|
|
966
|
+
*
|
|
967
|
+
* Las tres se ejecutan igual y las tres pasan por la misma autoridad. Ese es
|
|
968
|
+
* el punto: da igual quién escribió la capacidad, el gobierno es uno solo.
|
|
969
|
+
*
|
|
970
|
+
* ── Cero dependencias, y cero modelo ─────────────────────────────────────
|
|
971
|
+
* El SDK no trae ningún proveedor de IA. Quien lo use pasa su propia función
|
|
972
|
+
* de modelo — Ollama local, Claude, lo que salga el año que viene. Atarse a un
|
|
973
|
+
* proveedor sería heredar su suerte.
|
|
974
|
+
*/
|
|
975
|
+
|
|
976
|
+
interface CapabilityCall {
|
|
977
|
+
/** Nombre de la operación dentro de la capacidad. */
|
|
978
|
+
name: string;
|
|
979
|
+
args?: Record<string, unknown> | undefined;
|
|
980
|
+
/** Si mueve dinero, va aquí para que la autoridad lo revise de verdad. */
|
|
981
|
+
amount?: number | undefined;
|
|
982
|
+
currency?: string | undefined;
|
|
983
|
+
/**
|
|
984
|
+
* Un humano YA dio el visto bueno para ESTA llamada.
|
|
985
|
+
*
|
|
986
|
+
* Levanta la barrera solo aquí y ahora: no cambia la declaración, así que la
|
|
987
|
+
* próxima vez se vuelve a preguntar. Un "sí" no es un cheque en blanco.
|
|
988
|
+
* Nunca desbloquea lo prohibido — para eso está declarado prohibido y no
|
|
989
|
+
* "requiere aprobación".
|
|
990
|
+
*/
|
|
991
|
+
approved?: boolean | undefined;
|
|
992
|
+
}
|
|
993
|
+
interface CapabilityResult {
|
|
994
|
+
ok: boolean;
|
|
995
|
+
data?: unknown;
|
|
996
|
+
error?: string | undefined;
|
|
997
|
+
/** De dónde salió lo que devuelve. Sin esto no hay nada que auditar. */
|
|
998
|
+
evidence?: {
|
|
999
|
+
source: string;
|
|
1000
|
+
label: string;
|
|
1001
|
+
} | undefined;
|
|
1002
|
+
/** true si la autoridad exige que un humano confirme antes de ejecutar. */
|
|
1003
|
+
needsApproval?: boolean | undefined;
|
|
1004
|
+
}
|
|
1005
|
+
interface Capability {
|
|
1006
|
+
/** Identificador dentro del ecosistema. */
|
|
1007
|
+
readonly id: string;
|
|
1008
|
+
/** Qué operaciones ofrece, ya con su autoridad asignada. */
|
|
1009
|
+
readonly tools: ToolDef[];
|
|
1010
|
+
/** Ejecuta. Revisa autoridad ANTES de tocar nada. */
|
|
1011
|
+
run(call: CapabilityCall): Promise<CapabilityResult>;
|
|
1012
|
+
/** Suelta recursos (procesos, sockets). Llamar al quitar del ecosistema. */
|
|
1013
|
+
dispose?(): Promise<void> | void;
|
|
1014
|
+
}
|
|
1015
|
+
interface LocalCapabilityOptions {
|
|
1016
|
+
id: string;
|
|
1017
|
+
tools: ToolDef[];
|
|
1018
|
+
/** Tu código. Recibe el nombre y los argumentos ya validados. */
|
|
1019
|
+
handler: (name: string, args: Record<string, unknown>) => Promise<unknown> | unknown;
|
|
1020
|
+
}
|
|
1021
|
+
/** Convierte una función tuya en capacidad gobernada. El caso más simple. */
|
|
1022
|
+
declare function local(opts: LocalCapabilityOptions): Capability;
|
|
1023
|
+
interface HttpCapabilityOptions {
|
|
1024
|
+
id: string;
|
|
1025
|
+
/** Base de tu proyecto ya existente. */
|
|
1026
|
+
baseUrl: string;
|
|
1027
|
+
tools: ToolDef[];
|
|
1028
|
+
/** Cabeceras propias (tu API key, por ejemplo). */
|
|
1029
|
+
headers?: Record<string, string> | undefined;
|
|
1030
|
+
timeoutMs?: number | undefined;
|
|
1031
|
+
}
|
|
1032
|
+
/**
|
|
1033
|
+
* Un proyecto que ya tienes se vuelve capacidad **sin reescribirlo**.
|
|
1034
|
+
*
|
|
1035
|
+
* Es el caso de "tengo tres proyectos que no se hablan": se declaran sus
|
|
1036
|
+
* operaciones, se les pone autoridad, y dejan de ser islas.
|
|
1037
|
+
*/
|
|
1038
|
+
declare function http(opts: HttpCapabilityOptions): Capability;
|
|
1039
|
+
/**
|
|
1040
|
+
* Transporte de un servidor MCP.
|
|
1041
|
+
*
|
|
1042
|
+
* Es una interfaz y no una implementación fija para no atar el SDK a Node:
|
|
1043
|
+
* por HTTP funciona en cualquier runtime, y quien quiera stdio conecta su
|
|
1044
|
+
* propio transporte sin que el paquete cargue con `child_process`.
|
|
1045
|
+
*/
|
|
1046
|
+
interface MCPTransport {
|
|
1047
|
+
send(mensaje: unknown): Promise<unknown>;
|
|
1048
|
+
close?(): Promise<void> | void;
|
|
1049
|
+
}
|
|
1050
|
+
/** Transporte HTTP, el que funciona en todos lados. */
|
|
1051
|
+
declare function httpTransport(url: string, headers?: Record<string, string>): MCPTransport;
|
|
1052
|
+
interface MCPCapabilityOptions {
|
|
1053
|
+
id: string;
|
|
1054
|
+
transport: MCPTransport;
|
|
1055
|
+
/**
|
|
1056
|
+
* Autoridad por herramienta. Lo que no aparezca aquí queda PROHIBIDO.
|
|
1057
|
+
*
|
|
1058
|
+
* Es la decisión de diseño más importante de todo el archivo: conectas un
|
|
1059
|
+
* servidor de internet y **nada corre hasta que tú lo autorices**. Más
|
|
1060
|
+
* fricción, sí — y es justo lo que separa esto de "enchufa y reza".
|
|
1061
|
+
*/
|
|
1062
|
+
authority: Record<string, Authority>;
|
|
1063
|
+
/** Autoridad para lo que no esté nombrado. Por defecto, prohibida. */
|
|
1064
|
+
defaultAuthority?: Authority | undefined;
|
|
1065
|
+
/** Permiso que se le asigna a las herramientas importadas. */
|
|
1066
|
+
permission?: string | undefined;
|
|
1067
|
+
}
|
|
1068
|
+
/**
|
|
1069
|
+
* Conecta un servidor MCP de verdad: lista sus herramientas y las llama.
|
|
1070
|
+
*
|
|
1071
|
+
* Aquí están los miles de capacidades de código abierto que ya existen —
|
|
1072
|
+
* filesystem, GitHub, Postgres, navegador. No hay que construirlas: hay que
|
|
1073
|
+
* gobernarlas.
|
|
1074
|
+
*/
|
|
1075
|
+
declare function mcp(opts: MCPCapabilityOptions): Promise<Capability>;
|
|
1076
|
+
/** Todo junto, para importarlo de un jalón. */
|
|
1077
|
+
declare const capabilities: {
|
|
1078
|
+
local: typeof local;
|
|
1079
|
+
http: typeof http;
|
|
1080
|
+
mcp: typeof mcp;
|
|
1081
|
+
httpTransport: typeof httpTransport;
|
|
1082
|
+
};
|
|
1083
|
+
|
|
1084
|
+
/**
|
|
1085
|
+
* Ecosistemas — que las piezas sueltas dejen de ser islas.
|
|
1086
|
+
*
|
|
1087
|
+
* Un ecosistema es un conjunto de capacidades que comparten identidad,
|
|
1088
|
+
* contrato y reglas, aunque vivan en productos distintos, en máquinas
|
|
1089
|
+
* distintas, o las haya escrito gente distinta.
|
|
1090
|
+
*
|
|
1091
|
+
* Tus tres proyectos viejos, un modelo local, dos servidores MCP que bajaste
|
|
1092
|
+
* de internet y un repo que te gustó: eso es un ecosistema en cuanto algo los
|
|
1093
|
+
* gobierna igual. Sin gobierno, "conectar todo" solo hace el desastre más
|
|
1094
|
+
* grande.
|
|
1095
|
+
*
|
|
1096
|
+
* ── El bucle del agente ──────────────────────────────────────────────────
|
|
1097
|
+
* También vive aquí, y corre con EL MODELO QUE PONGA EL DESARROLLADOR. El SDK
|
|
1098
|
+
* no trae ninguno: recibe una función que habla y devuelve texto. Ollama en su
|
|
1099
|
+
* máquina, Claude, o lo que salga el año que viene.
|
|
1100
|
+
*/
|
|
1101
|
+
|
|
1102
|
+
interface EcosystemConfig {
|
|
1103
|
+
name: string;
|
|
1104
|
+
/** Las capacidades que lo componen, ya construidas. */
|
|
1105
|
+
capabilities: Capability[];
|
|
1106
|
+
/**
|
|
1107
|
+
* Reglas por patrón, aplicadas SOBRE lo que cada capacidad declare.
|
|
1108
|
+
*
|
|
1109
|
+
* Se admite `*` al final: `'delete_*'`. Sirve para poner una regla de casa
|
|
1110
|
+
* —"nada que borre corre solo"— sin revisar herramienta por herramienta
|
|
1111
|
+
* cuando conectas un servidor con treinta.
|
|
1112
|
+
*/
|
|
1113
|
+
authority?: Record<string, Authority> | undefined;
|
|
1114
|
+
}
|
|
1115
|
+
interface Ecosystem {
|
|
1116
|
+
readonly name: string;
|
|
1117
|
+
/** Todas las herramientas, con su capacidad de origen. */
|
|
1118
|
+
readonly tools: (ToolDef & {
|
|
1119
|
+
capability: string;
|
|
1120
|
+
})[];
|
|
1121
|
+
/** Ejecuta buscando en qué capacidad vive esa herramienta. */
|
|
1122
|
+
run(call: CapabilityCall): Promise<CapabilityResult>;
|
|
1123
|
+
/** Quita una capacidad en caliente. */
|
|
1124
|
+
remove(capabilityId: string): Promise<void>;
|
|
1125
|
+
/** Agrega una capacidad en caliente. */
|
|
1126
|
+
add(capability: Capability): void;
|
|
1127
|
+
dispose(): Promise<void>;
|
|
1128
|
+
}
|
|
1129
|
+
declare function defineEcosystem(cfg: EcosystemConfig): Ecosystem;
|
|
1130
|
+
/**
|
|
1131
|
+
* Función de modelo. La pone el desarrollador.
|
|
1132
|
+
*
|
|
1133
|
+
* Recibe el mensaje del usuario y las herramientas disponibles; devuelve texto
|
|
1134
|
+
* o una acción a ejecutar. El SDK no sabe ni le importa qué hay detrás.
|
|
1135
|
+
*/
|
|
1136
|
+
type ModelFn = (input: {
|
|
1137
|
+
message: string;
|
|
1138
|
+
tools: {
|
|
1139
|
+
name: string;
|
|
1140
|
+
description: string;
|
|
1141
|
+
}[];
|
|
1142
|
+
history: {
|
|
1143
|
+
role: 'user' | 'agent';
|
|
1144
|
+
text: string;
|
|
1145
|
+
}[];
|
|
1146
|
+
lastResult?: CapabilityResult | undefined;
|
|
1147
|
+
}) => Promise<{
|
|
1148
|
+
text?: string;
|
|
1149
|
+
action?: {
|
|
1150
|
+
name: string;
|
|
1151
|
+
args?: Record<string, unknown>;
|
|
1152
|
+
};
|
|
1153
|
+
}>;
|
|
1154
|
+
interface AgentLoopOptions {
|
|
1155
|
+
ecosystem: Ecosystem;
|
|
1156
|
+
model: ModelFn;
|
|
1157
|
+
/**
|
|
1158
|
+
* Cómo se pide el visto bueno humano. Si no se define, lo que requiera
|
|
1159
|
+
* aprobación simplemente no se ejecuta — que es el comportamiento seguro.
|
|
1160
|
+
*/
|
|
1161
|
+
onApproval?: ((tool: string, args: Record<string, unknown>) => Promise<boolean>) | undefined;
|
|
1162
|
+
/** Tope de vueltas. Un agente sin tope es una factura sin tope. */
|
|
1163
|
+
maxSteps?: number | undefined;
|
|
1164
|
+
}
|
|
1165
|
+
interface AgentTurn {
|
|
1166
|
+
text?: string | undefined;
|
|
1167
|
+
steps: {
|
|
1168
|
+
action: string;
|
|
1169
|
+
ok: boolean;
|
|
1170
|
+
error?: string | undefined;
|
|
1171
|
+
}[];
|
|
1172
|
+
}
|
|
1173
|
+
/**
|
|
1174
|
+
* Corre un turno completo: el modelo decide, la autoridad revisa, la capacidad
|
|
1175
|
+
* ejecuta, y el resultado vuelve al modelo para que cierre.
|
|
1176
|
+
*
|
|
1177
|
+
* Con esto alguien se arma un agente entero sin tocar ninguna plataforma.
|
|
1178
|
+
*/
|
|
1179
|
+
declare function agentLoop(opts: AgentLoopOptions): Promise<(message: string, history?: {
|
|
1180
|
+
role: "user" | "agent";
|
|
1181
|
+
text: string;
|
|
1182
|
+
}[]) => Promise<AgentTurn>>;
|
|
1183
|
+
|
|
1184
|
+
/**
|
|
1185
|
+
* Puente con MCP (Model Context Protocol), en las dos direcciones.
|
|
1186
|
+
*
|
|
1187
|
+
* MCP ganó como estándar para conectar agentes con herramientas: es lo que
|
|
1188
|
+
* usan Anthropic, OpenAI y Google, y hay miles de servidores ya escritos.
|
|
1189
|
+
* Pelearse con él sería quedarse solo; el camino es envolverlo.
|
|
1190
|
+
*
|
|
1191
|
+
* ── Por qué esto no es "adoptar MCP y ya" ────────────────────────────────
|
|
1192
|
+
* MCP describe QUÉ puede hacer una herramienta. No sabe decir HASTA DÓNDE:
|
|
1193
|
+
* no tiene forma de expresar "hasta $500 solo, arriba pregunta, y nunca
|
|
1194
|
+
* borrar". Esa es una carencia reconocida del protocolo, no una opinión.
|
|
1195
|
+
*
|
|
1196
|
+
* Entonces el reparto queda así:
|
|
1197
|
+
* MCP → el catálogo y el transporte. Lo que ya funciona, se reutiliza.
|
|
1198
|
+
* VAIA → la autoridad, el consentimiento y la evidencia. Lo que falta.
|
|
1199
|
+
*
|
|
1200
|
+
* Una herramienta MCP importada entra SIN autoridad, y así no puede
|
|
1201
|
+
* ejecutarse: hay que asignársela explícitamente. Es a propósito — importar
|
|
1202
|
+
* algo de internet no debería dar permisos por el hecho de importarlo.
|
|
1203
|
+
*/
|
|
1204
|
+
|
|
1205
|
+
/** Esquema JSON de los argumentos, tal como lo publica un servidor MCP. */
|
|
1206
|
+
interface MCPInputSchema {
|
|
1207
|
+
type: 'object';
|
|
1208
|
+
properties?: Record<string, {
|
|
1209
|
+
type?: string;
|
|
1210
|
+
description?: string;
|
|
1211
|
+
enum?: string[];
|
|
1212
|
+
}> | undefined;
|
|
1213
|
+
required?: string[] | undefined;
|
|
1214
|
+
}
|
|
1215
|
+
interface MCPTool {
|
|
1216
|
+
name: string;
|
|
1217
|
+
description?: string | undefined;
|
|
1218
|
+
inputSchema?: MCPInputSchema | undefined;
|
|
1219
|
+
/** Pistas del servidor sobre si la herramienta destruye o no. */
|
|
1220
|
+
annotations?: {
|
|
1221
|
+
readOnlyHint?: boolean | undefined;
|
|
1222
|
+
destructiveHint?: boolean | undefined;
|
|
1223
|
+
idempotentHint?: boolean | undefined;
|
|
1224
|
+
} | undefined;
|
|
1225
|
+
}
|
|
1226
|
+
/**
|
|
1227
|
+
* Convierte una herramienta MCP en una declaración VAIA.
|
|
1228
|
+
*
|
|
1229
|
+
* La autoridad se pide aparte y es obligatoria: el servidor MCP describe lo
|
|
1230
|
+
* que sabe hacer, pero **quién decide hasta dónde puede llegar es el dueño de
|
|
1231
|
+
* la plataforma, no el servidor**. Confiar en lo que el propio servidor diga
|
|
1232
|
+
* de sí mismo sería dejar que quien se importa se autoconceda permisos.
|
|
1233
|
+
*
|
|
1234
|
+
* Las pistas del servidor se usan solo para AVISAR de incoherencias, nunca
|
|
1235
|
+
* para decidir.
|
|
1236
|
+
*/
|
|
1237
|
+
declare function fromMCPTool(tool: MCPTool, authority: Authority, permission: string): {
|
|
1238
|
+
tool: ToolDef;
|
|
1239
|
+
warnings: string[];
|
|
1240
|
+
};
|
|
1241
|
+
/**
|
|
1242
|
+
* Publica una herramienta VAIA como herramienta MCP.
|
|
1243
|
+
*
|
|
1244
|
+
* Se rellenan las pistas a partir de la autoridad declarada, para que del otro
|
|
1245
|
+
* lado sepan a qué atenerse. Y algo importante: **lo que requiere aprobación o
|
|
1246
|
+
* está prohibido no se publica**. Exponerlo por MCP sería ofrecerle a un
|
|
1247
|
+
* agente externo algo que ni el propio dueño puede ejecutar solo.
|
|
1248
|
+
*/
|
|
1249
|
+
declare function toMCPTool(tool: ToolDef): MCPTool | null;
|
|
1250
|
+
/** Publica un conjunto, descartando lo que no debe salir. */
|
|
1251
|
+
declare function toMCPTools(tools: ToolDef[]): {
|
|
1252
|
+
published: MCPTool[];
|
|
1253
|
+
withheld: string[];
|
|
1254
|
+
};
|
|
1255
|
+
|
|
507
1256
|
/**
|
|
508
1257
|
* @vaia/sdk — VAIA Platform Integration SDK
|
|
509
1258
|
*
|
|
@@ -518,4 +1267,4 @@ declare function toManifest(config: CapabilityConfig): VAIAManifest;
|
|
|
518
1267
|
declare const gandia: typeof _gandia;
|
|
519
1268
|
declare const handeia: typeof _handeia;
|
|
520
1269
|
|
|
521
|
-
export { type ActionPayload, type ActionResponse, type AuditRecord, type CapabilityConfig, type CardPayload, type CardResponse, type DataResponse, type EcoTarget, type ErrorResponse, type GandiaContext, type GandiaJWTClaims, type GandiaTenant, type GandiaUser, type HandeiaContext, type HandeiaJWTClaims, type HandeiaUser, type NodeType, type OutputType, type PublishType, type RespondOpts, type Risk, type Surface, type SurfaceHandlers, type TablePayload, type TableResponse, type TextResponse, VAIAError, type VAIAManifest, type VAIAResponse, type WidgetPayload, type WidgetResponse, defineCapability, gandia, handeia, toManifest };
|
|
1270
|
+
export { AGENT_PROTOCOL_VERSION, type ActionPayload, type ActionResponse, type AgentAction, type AgentActionParam, type AgentActionResult, type AgentDef, type AgentEvidence, type AgentHandle, type AgentLoopOptions, type AgentSpaceContext, type AgentSurfaceConfig, type AgentTurn, type AgentTurnRequest, type AgentTurnResponse, type AuditRecord, type Authority, type AuthorityLevel, CONNECTOR_OF_OPERATION, type Capability, type CapabilityCall, type CapabilityConfig, type CapabilityResult, type CardPayload, type CardResponse, type ConnectorNeed, type ConnectorOperation, type ConnectorRequest, type ConnectorResult, type Consequence, type DataResponse, type EcoTarget, type Ecosystem, type EcosystemConfig, type ErrorResponse, type EvidenceKind, type EvidencePolicy, type GandiaContext, type GandiaJWTClaims, type GandiaTenant, type GandiaUser, type HandeiaContext, type HandeiaJWTClaims, type HandeiaUser, type HttpCapabilityOptions, type LocalCapabilityOptions, type MCPCapabilityOptions, type MCPInputSchema, type MCPTool, type MCPTransport, type ModalityDef, type ModelFn, type MountAgentOptions, type NodeType, type OutputType, type PersonalityDef, type PiecesConfig, type PublishType, type RespondOpts, type Risk, type SkillDef, type Surface, type SurfaceHandlers, type TablePayload, type TableResponse, type TextResponse, type ToolDef, VAIAError, type VAIAManifest, type VAIAResponse, type WidgetPayload, type WidgetResponse, type WorkflowDef, agentLoop, capabilities, checkAuthority, defineCapability, defineEcosystem, fromMCPTool, gandia, handeia, http, httpTransport, local, mcp, mountAgent, requiresApproval, toMCPTool, toMCPTools, toManifest, validateActionCall, validateAgentSurface, validatePieces };
|