@vaia-lab/sdk 0.2.0 → 0.4.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/agent-1bVw0eB8.d.cts +222 -0
- package/dist/agent-1bVw0eB8.d.ts +222 -0
- package/dist/cli.js +252 -0
- package/dist/index.cjs +495 -12
- package/dist/index.d.cts +487 -5
- package/dist/index.d.ts +487 -5
- package/dist/index.js +477 -11
- package/dist/react/index.cjs +1240 -0
- package/dist/react/index.d.cts +95 -0
- package/dist/react/index.d.ts +95 -0
- package/dist/react/index.js +1228 -0
- package/package.json +45 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,166 @@
|
|
|
1
|
+
import { A as AgentSurfaceConfig, a as AgentAction } from './agent-1bVw0eB8.js';
|
|
2
|
+
export { b as AGENT_PROTOCOL_VERSION, c as AgentActionParam, d as AgentActionResult, e as AgentEvidence, f as AgentSpaceContext, g as AgentTurnRequest, h as AgentTurnResponse, C as CONNECTOR_OF_OPERATION, i as ConnectorNeed, j as ConnectorOperation, k as ConnectorRequest, l as ConnectorResult, v as validateActionCall, m as validateAgentSurface } from './agent-1bVw0eB8.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Las 7 piezas operativas del ecosistema VAIA.
|
|
6
|
+
*
|
|
7
|
+
* Skills → capacidades atómicas verificadas
|
|
8
|
+
* Agentes → entidades persistentes con objetivos y autoridad
|
|
9
|
+
* Herramientas → acciones permitidas en el mundo real
|
|
10
|
+
* Workflows → procesos multi-paso
|
|
11
|
+
* Modalidades → cómo entra y sale la información
|
|
12
|
+
* Personalidades → estilos de comunicación
|
|
13
|
+
* Permisos → quién puede qué, sobre qué, cuándo
|
|
14
|
+
*
|
|
15
|
+
* Este archivo NO las implementa: las declara. El motor que las ejecuta es
|
|
16
|
+
* privado; lo público es la forma de describirlas y las reglas que deben
|
|
17
|
+
* cumplir para poder existir.
|
|
18
|
+
*
|
|
19
|
+
* ── Lo que separa esto de otros SDK de agentes ───────────────────────────
|
|
20
|
+
* Casi todos saben decir "el agente puede llamar a esta función". Ninguno sabe
|
|
21
|
+
* decir "puede hasta $500 solo, arriba de eso pregunta, y nunca puede borrar".
|
|
22
|
+
* Esa es la parte que aquí es obligatoria, no opcional: un agente sin autoridad
|
|
23
|
+
* declarada ni siquiera compila.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Qué tan lejos puede llegar algo por su cuenta.
|
|
27
|
+
*
|
|
28
|
+
* No es un booleano "puede o no puede". La autoridad se delega como a una
|
|
29
|
+
* persona: por categoría, por monto y por consecuencia.
|
|
30
|
+
*/
|
|
31
|
+
type AuthorityLevel =
|
|
32
|
+
/** Lo hace solo. Reservado a lo que no tiene consecuencia irreversible. */
|
|
33
|
+
'autonoma'
|
|
34
|
+
/** Lo prepara, pero un humano aprueba antes de que ocurra. */
|
|
35
|
+
| 'requiere_aprobacion'
|
|
36
|
+
/** No puede, nunca, aunque el usuario lo pida. */
|
|
37
|
+
| 'prohibida';
|
|
38
|
+
/** Qué tan grave es equivocarse aquí. Decide cuánta ceremonia merece. */
|
|
39
|
+
type Consequence = 'reversible' | 'costosa' | 'irreversible';
|
|
40
|
+
interface Authority {
|
|
41
|
+
level: AuthorityLevel;
|
|
42
|
+
consequence: Consequence;
|
|
43
|
+
/** Tope de gasto por ejecución, si mueve dinero. */
|
|
44
|
+
maxAmount?: number | undefined;
|
|
45
|
+
/** Moneda del tope. Obligatoria si hay tope: "500" sin moneda no significa nada. */
|
|
46
|
+
currency?: string | undefined;
|
|
47
|
+
/** Cuántas veces por hora, como mucho. */
|
|
48
|
+
maxPerHour?: number | undefined;
|
|
49
|
+
/** Por qué se delegó así. Se le muestra al usuario cuando concede. */
|
|
50
|
+
rationale?: string | undefined;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* De dónde sale lo que el sistema afirma.
|
|
54
|
+
*
|
|
55
|
+
* Es obligatoria en todo lo que produzca una afirmación. Un asistente que no
|
|
56
|
+
* puede decir de dónde sacó algo es un oráculo, y un oráculo no se audita ni
|
|
57
|
+
* se corrige. Este es el pilar de info verificada hecho tipo.
|
|
58
|
+
*/
|
|
59
|
+
type EvidenceKind = 'fuente' | 'calculo' | 'usuario' | 'externo' | 'inferencia';
|
|
60
|
+
interface EvidencePolicy {
|
|
61
|
+
/** Tipos admitidos para respaldar una afirmación de esta pieza. */
|
|
62
|
+
accepts: EvidenceKind[];
|
|
63
|
+
/**
|
|
64
|
+
* Si es true, una respuesta sin evidencia se rechaza en vez de entregarse.
|
|
65
|
+
* Debe estar en true en cualquier cosa que informe decisiones reales.
|
|
66
|
+
*/
|
|
67
|
+
required: boolean;
|
|
68
|
+
}
|
|
69
|
+
interface PiezaBase {
|
|
70
|
+
/** Estable, en minúsculas con guion bajo. */
|
|
71
|
+
name: string;
|
|
72
|
+
/** Qué es y cuándo usarlo. Es lo que lee el modelo para decidir. */
|
|
73
|
+
description: string;
|
|
74
|
+
}
|
|
75
|
+
/** Capacidad atómica y verificable. El verbo del sistema. */
|
|
76
|
+
interface SkillDef extends PiezaBase {
|
|
77
|
+
/** Qué necesita recibir. */
|
|
78
|
+
inputs?: {
|
|
79
|
+
name: string;
|
|
80
|
+
type: 'string' | 'number' | 'boolean';
|
|
81
|
+
required?: boolean | undefined;
|
|
82
|
+
}[] | undefined;
|
|
83
|
+
/** Cómo se comprueba que salió bien. Sin esto no es "verificada". */
|
|
84
|
+
verification?: string | undefined;
|
|
85
|
+
evidence?: EvidencePolicy | undefined;
|
|
86
|
+
}
|
|
87
|
+
/** Acción sobre el mundo real. Siempre lleva autoridad. */
|
|
88
|
+
interface ToolDef extends PiezaBase {
|
|
89
|
+
authority: Authority;
|
|
90
|
+
/** Permiso que el usuario debe conceder. */
|
|
91
|
+
permission: string;
|
|
92
|
+
}
|
|
93
|
+
/** Proceso multi-paso. La autoridad del conjunto no puede ser menor que la
|
|
94
|
+
* del paso más grave que contiene. */
|
|
95
|
+
interface WorkflowDef extends PiezaBase {
|
|
96
|
+
steps: {
|
|
97
|
+
skill?: string | undefined;
|
|
98
|
+
tool?: string | undefined;
|
|
99
|
+
description: string;
|
|
100
|
+
}[];
|
|
101
|
+
authority: Authority;
|
|
102
|
+
}
|
|
103
|
+
/** Cómo entra y sale la información. */
|
|
104
|
+
type ModalityDef = 'texto' | 'voz' | 'imagen' | 'documento' | 'sensor';
|
|
105
|
+
/** Estilo de comunicación. No es adorno: un agente reconocible es un agente
|
|
106
|
+
* con el que se sostiene una relación. */
|
|
107
|
+
interface PersonalityDef {
|
|
108
|
+
name: string;
|
|
109
|
+
tone: 'formal' | 'cercano' | 'tecnico' | 'calido' | 'directo';
|
|
110
|
+
/** Rasgos que lo hacen reconocible. */
|
|
111
|
+
traits?: string[] | undefined;
|
|
112
|
+
/** Lo que NUNCA dice o hace, aunque se lo pidan. */
|
|
113
|
+
neverDoes?: string[] | undefined;
|
|
114
|
+
}
|
|
115
|
+
/** Entidad persistente con objetivos, autoridad y memoria. */
|
|
116
|
+
interface AgentDef extends PiezaBase {
|
|
117
|
+
/** Por qué existe. Si no se puede escribir, el agente no debería existir. */
|
|
118
|
+
purpose: string;
|
|
119
|
+
personality?: PersonalityDef | undefined;
|
|
120
|
+
/** Skills que conoce. */
|
|
121
|
+
skills?: string[] | undefined;
|
|
122
|
+
/** Herramientas que puede invocar. */
|
|
123
|
+
tools?: string[] | undefined;
|
|
124
|
+
workflows?: string[] | undefined;
|
|
125
|
+
modalities?: ModalityDef[] | undefined;
|
|
126
|
+
/** Techo de autoridad del agente. Ninguna herramienta suya puede superarlo. */
|
|
127
|
+
authority: Authority;
|
|
128
|
+
evidence?: EvidencePolicy | undefined;
|
|
129
|
+
}
|
|
130
|
+
/** Todo lo que una capacidad declara sobre sus piezas. */
|
|
131
|
+
interface PiecesConfig {
|
|
132
|
+
skills?: SkillDef[] | undefined;
|
|
133
|
+
tools?: ToolDef[] | undefined;
|
|
134
|
+
workflows?: WorkflowDef[] | undefined;
|
|
135
|
+
agents?: AgentDef[] | undefined;
|
|
136
|
+
personalities?: PersonalityDef[] | undefined;
|
|
137
|
+
modalities?: ModalityDef[] | undefined;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Valida las piezas al DECLARARLAS.
|
|
141
|
+
*
|
|
142
|
+
* Corre en el escritorio del desarrollador, no en producción. Las reglas que
|
|
143
|
+
* impone no son de estilo: cada una cierra una forma concreta de causar daño.
|
|
144
|
+
*/
|
|
145
|
+
declare function validatePieces(cfg: PiecesConfig): string[];
|
|
146
|
+
/** ¿Puede esta pieza actuar sola, o hay que preguntarle al humano? */
|
|
147
|
+
declare function requiresApproval(a: Authority): boolean;
|
|
148
|
+
/**
|
|
149
|
+
* ¿Alcanza la autoridad para ESTA ejecución concreta?
|
|
150
|
+
*
|
|
151
|
+
* La declaración dice el techo; esto revisa el caso puntual, que es donde
|
|
152
|
+
* de verdad se decide.
|
|
153
|
+
*/
|
|
154
|
+
declare function checkAuthority(a: Authority, intento?: {
|
|
155
|
+
amount?: number | undefined;
|
|
156
|
+
currency?: string | undefined;
|
|
157
|
+
}): {
|
|
158
|
+
ok: true;
|
|
159
|
+
} | {
|
|
160
|
+
ok: false;
|
|
161
|
+
reason: string;
|
|
162
|
+
};
|
|
163
|
+
|
|
1
164
|
type PublishType = 'app' | 'ia' | 'skill' | 'eco';
|
|
2
165
|
type EcoTarget = 'gandia' | 'handeia' | 'both';
|
|
3
166
|
type NodeType = 'widget' | 'artefacto' | 'espacio' | 'skill' | 'agente';
|
|
@@ -14,7 +177,7 @@ interface GandiaUser {
|
|
|
14
177
|
role: string;
|
|
15
178
|
email?: string | undefined;
|
|
16
179
|
}
|
|
17
|
-
/** Context injected by
|
|
180
|
+
/** Context injected by the platform on every invoke call to your server. */
|
|
18
181
|
interface GandiaContext {
|
|
19
182
|
capability_id: string;
|
|
20
183
|
call_id: string;
|
|
@@ -22,7 +185,7 @@ interface GandiaContext {
|
|
|
22
185
|
user: GandiaUser;
|
|
23
186
|
permissions: string[];
|
|
24
187
|
trigger: 'user_query' | 'gaia_invoke' | 'event';
|
|
25
|
-
/** Surface
|
|
188
|
+
/** Surface the platform wants to render — determines which respond.* to use. */
|
|
26
189
|
surface: Surface;
|
|
27
190
|
query?: string | undefined;
|
|
28
191
|
}
|
|
@@ -31,14 +194,14 @@ interface HandeiaUser {
|
|
|
31
194
|
email?: string | undefined;
|
|
32
195
|
name?: string | undefined;
|
|
33
196
|
}
|
|
34
|
-
/** Context injected by
|
|
197
|
+
/** Context injected by the platform on every invoke call to your server. */
|
|
35
198
|
interface HandeiaContext {
|
|
36
199
|
capability_id: string;
|
|
37
200
|
call_id: string;
|
|
38
201
|
user: HandeiaUser;
|
|
39
202
|
permissions: string[];
|
|
40
203
|
trigger: 'user_action' | 'haia_invoke' | 'schedule';
|
|
41
|
-
/** Surface
|
|
204
|
+
/** Surface the platform wants to render. */
|
|
42
205
|
surface: Surface;
|
|
43
206
|
query?: string | undefined;
|
|
44
207
|
}
|
|
@@ -162,6 +325,16 @@ interface CapabilityConfig {
|
|
|
162
325
|
sector: string;
|
|
163
326
|
/** Which surfaces the capability can respond to, and their invoke endpoint. */
|
|
164
327
|
surfaces: Partial<Record<Surface, SurfaceConfig>>;
|
|
328
|
+
/**
|
|
329
|
+
* Superficie de AGENTE — el asistente de Handeia dentro de este espacio.
|
|
330
|
+
* El espacio declara qué sabe hacer; Handeia razona y decide. Ver agent.ts.
|
|
331
|
+
*/
|
|
332
|
+
agent?: AgentSurfaceConfig | undefined;
|
|
333
|
+
/**
|
|
334
|
+
* Las 7 piezas operativas: skills, herramientas, workflows, agentes,
|
|
335
|
+
* personalidades y modalidades. Con su autoridad y su evidencia. Ver pieces.ts.
|
|
336
|
+
*/
|
|
337
|
+
pieces?: PiecesConfig | undefined;
|
|
165
338
|
permissions: string[];
|
|
166
339
|
risk: Risk;
|
|
167
340
|
description?: string | undefined;
|
|
@@ -487,6 +660,15 @@ interface VAIAManifest {
|
|
|
487
660
|
level?: string | undefined;
|
|
488
661
|
sector: string;
|
|
489
662
|
surfaces: string[];
|
|
663
|
+
/** Superficie de agente: qué sabe hacer el espacio y por dónde preguntarle.
|
|
664
|
+
* Se publica en el manifest para que el portal y Handeia lo conozcan sin
|
|
665
|
+
* tener que abrir el código de nadie. */
|
|
666
|
+
agent?: {
|
|
667
|
+
protocol: number;
|
|
668
|
+
actions: AgentAction[];
|
|
669
|
+
query_endpoint?: string | undefined;
|
|
670
|
+
} | undefined;
|
|
671
|
+
pieces?: PiecesConfig | undefined;
|
|
490
672
|
permissions: string[];
|
|
491
673
|
risk: Risk;
|
|
492
674
|
has_own_auth: boolean;
|
|
@@ -504,6 +686,306 @@ declare function defineCapability(config: CapabilityConfig): CapabilityConfig;
|
|
|
504
686
|
/** Converts a CapabilityConfig to a gandia.manifest.json object. */
|
|
505
687
|
declare function toManifest(config: CapabilityConfig): VAIAManifest;
|
|
506
688
|
|
|
689
|
+
/**
|
|
690
|
+
* Capacidades que CORREN.
|
|
691
|
+
*
|
|
692
|
+
* El resto del SDK declara y valida. Esto ejecuta. Es la diferencia entre
|
|
693
|
+
* darle a alguien el letrero de la puerta y darle la puerta.
|
|
694
|
+
*
|
|
695
|
+
* ── Las tres formas de tener una capacidad ───────────────────────────────
|
|
696
|
+
* local() → una función tuya, gobernada
|
|
697
|
+
* http() → un proyecto que ya tienes, sin reescribirlo
|
|
698
|
+
* mcp() → miles que ya existen en código abierto, con reglas encima
|
|
699
|
+
*
|
|
700
|
+
* Las tres se ejecutan igual y las tres pasan por la misma autoridad. Ese es
|
|
701
|
+
* el punto: da igual quién escribió la capacidad, el gobierno es uno solo.
|
|
702
|
+
*
|
|
703
|
+
* ── Cero dependencias, y cero modelo ─────────────────────────────────────
|
|
704
|
+
* El SDK no trae ningún proveedor de IA. Quien lo use pasa su propia función
|
|
705
|
+
* de modelo — Ollama local, Claude, lo que salga el año que viene. Atarse a un
|
|
706
|
+
* proveedor sería heredar su suerte.
|
|
707
|
+
*/
|
|
708
|
+
|
|
709
|
+
interface CapabilityCall {
|
|
710
|
+
/** Nombre de la operación dentro de la capacidad. */
|
|
711
|
+
name: string;
|
|
712
|
+
args?: Record<string, unknown> | undefined;
|
|
713
|
+
/** Si mueve dinero, va aquí para que la autoridad lo revise de verdad. */
|
|
714
|
+
amount?: number | undefined;
|
|
715
|
+
currency?: string | undefined;
|
|
716
|
+
/**
|
|
717
|
+
* Un humano YA dio el visto bueno para ESTA llamada.
|
|
718
|
+
*
|
|
719
|
+
* Levanta la barrera solo aquí y ahora: no cambia la declaración, así que la
|
|
720
|
+
* próxima vez se vuelve a preguntar. Un "sí" no es un cheque en blanco.
|
|
721
|
+
* Nunca desbloquea lo prohibido — para eso está declarado prohibido y no
|
|
722
|
+
* "requiere aprobación".
|
|
723
|
+
*/
|
|
724
|
+
approved?: boolean | undefined;
|
|
725
|
+
}
|
|
726
|
+
interface CapabilityResult {
|
|
727
|
+
ok: boolean;
|
|
728
|
+
data?: unknown;
|
|
729
|
+
error?: string | undefined;
|
|
730
|
+
/** De dónde salió lo que devuelve. Sin esto no hay nada que auditar. */
|
|
731
|
+
evidence?: {
|
|
732
|
+
source: string;
|
|
733
|
+
label: string;
|
|
734
|
+
} | undefined;
|
|
735
|
+
/** true si la autoridad exige que un humano confirme antes de ejecutar. */
|
|
736
|
+
needsApproval?: boolean | undefined;
|
|
737
|
+
}
|
|
738
|
+
interface Capability {
|
|
739
|
+
/** Identificador dentro del ecosistema. */
|
|
740
|
+
readonly id: string;
|
|
741
|
+
/** Qué operaciones ofrece, ya con su autoridad asignada. */
|
|
742
|
+
readonly tools: ToolDef[];
|
|
743
|
+
/** Ejecuta. Revisa autoridad ANTES de tocar nada. */
|
|
744
|
+
run(call: CapabilityCall): Promise<CapabilityResult>;
|
|
745
|
+
/** Suelta recursos (procesos, sockets). Llamar al quitar del ecosistema. */
|
|
746
|
+
dispose?(): Promise<void> | void;
|
|
747
|
+
}
|
|
748
|
+
interface LocalCapabilityOptions {
|
|
749
|
+
id: string;
|
|
750
|
+
tools: ToolDef[];
|
|
751
|
+
/** Tu código. Recibe el nombre y los argumentos ya validados. */
|
|
752
|
+
handler: (name: string, args: Record<string, unknown>) => Promise<unknown> | unknown;
|
|
753
|
+
}
|
|
754
|
+
/** Convierte una función tuya en capacidad gobernada. El caso más simple. */
|
|
755
|
+
declare function local(opts: LocalCapabilityOptions): Capability;
|
|
756
|
+
interface HttpCapabilityOptions {
|
|
757
|
+
id: string;
|
|
758
|
+
/** Base de tu proyecto ya existente. */
|
|
759
|
+
baseUrl: string;
|
|
760
|
+
tools: ToolDef[];
|
|
761
|
+
/** Cabeceras propias (tu API key, por ejemplo). */
|
|
762
|
+
headers?: Record<string, string> | undefined;
|
|
763
|
+
timeoutMs?: number | undefined;
|
|
764
|
+
}
|
|
765
|
+
/**
|
|
766
|
+
* Un proyecto que ya tienes se vuelve capacidad **sin reescribirlo**.
|
|
767
|
+
*
|
|
768
|
+
* Es el caso de "tengo tres proyectos que no se hablan": se declaran sus
|
|
769
|
+
* operaciones, se les pone autoridad, y dejan de ser islas.
|
|
770
|
+
*/
|
|
771
|
+
declare function http(opts: HttpCapabilityOptions): Capability;
|
|
772
|
+
/**
|
|
773
|
+
* Transporte de un servidor MCP.
|
|
774
|
+
*
|
|
775
|
+
* Es una interfaz y no una implementación fija para no atar el SDK a Node:
|
|
776
|
+
* por HTTP funciona en cualquier runtime, y quien quiera stdio conecta su
|
|
777
|
+
* propio transporte sin que el paquete cargue con `child_process`.
|
|
778
|
+
*/
|
|
779
|
+
interface MCPTransport {
|
|
780
|
+
send(mensaje: unknown): Promise<unknown>;
|
|
781
|
+
close?(): Promise<void> | void;
|
|
782
|
+
}
|
|
783
|
+
/** Transporte HTTP, el que funciona en todos lados. */
|
|
784
|
+
declare function httpTransport(url: string, headers?: Record<string, string>): MCPTransport;
|
|
785
|
+
interface MCPCapabilityOptions {
|
|
786
|
+
id: string;
|
|
787
|
+
transport: MCPTransport;
|
|
788
|
+
/**
|
|
789
|
+
* Autoridad por herramienta. Lo que no aparezca aquí queda PROHIBIDO.
|
|
790
|
+
*
|
|
791
|
+
* Es la decisión de diseño más importante de todo el archivo: conectas un
|
|
792
|
+
* servidor de internet y **nada corre hasta que tú lo autorices**. Más
|
|
793
|
+
* fricción, sí — y es justo lo que separa esto de "enchufa y reza".
|
|
794
|
+
*/
|
|
795
|
+
authority: Record<string, Authority>;
|
|
796
|
+
/** Autoridad para lo que no esté nombrado. Por defecto, prohibida. */
|
|
797
|
+
defaultAuthority?: Authority | undefined;
|
|
798
|
+
/** Permiso que se le asigna a las herramientas importadas. */
|
|
799
|
+
permission?: string | undefined;
|
|
800
|
+
}
|
|
801
|
+
/**
|
|
802
|
+
* Conecta un servidor MCP de verdad: lista sus herramientas y las llama.
|
|
803
|
+
*
|
|
804
|
+
* Aquí están los miles de capacidades de código abierto que ya existen —
|
|
805
|
+
* filesystem, GitHub, Postgres, navegador. No hay que construirlas: hay que
|
|
806
|
+
* gobernarlas.
|
|
807
|
+
*/
|
|
808
|
+
declare function mcp(opts: MCPCapabilityOptions): Promise<Capability>;
|
|
809
|
+
/** Todo junto, para importarlo de un jalón. */
|
|
810
|
+
declare const capabilities: {
|
|
811
|
+
local: typeof local;
|
|
812
|
+
http: typeof http;
|
|
813
|
+
mcp: typeof mcp;
|
|
814
|
+
httpTransport: typeof httpTransport;
|
|
815
|
+
};
|
|
816
|
+
|
|
817
|
+
/**
|
|
818
|
+
* Ecosistemas — que las piezas sueltas dejen de ser islas.
|
|
819
|
+
*
|
|
820
|
+
* Un ecosistema es un conjunto de capacidades que comparten identidad,
|
|
821
|
+
* contrato y reglas, aunque vivan en productos distintos, en máquinas
|
|
822
|
+
* distintas, o las haya escrito gente distinta.
|
|
823
|
+
*
|
|
824
|
+
* Tus tres proyectos viejos, un modelo local, dos servidores MCP que bajaste
|
|
825
|
+
* de internet y un repo que te gustó: eso es un ecosistema en cuanto algo los
|
|
826
|
+
* gobierna igual. Sin gobierno, "conectar todo" solo hace el desastre más
|
|
827
|
+
* grande.
|
|
828
|
+
*
|
|
829
|
+
* ── El bucle del agente ──────────────────────────────────────────────────
|
|
830
|
+
* También vive aquí, y corre con EL MODELO QUE PONGA EL DESARROLLADOR. El SDK
|
|
831
|
+
* no trae ninguno: recibe una función que habla y devuelve texto. Ollama en su
|
|
832
|
+
* máquina, Claude, o lo que salga el año que viene.
|
|
833
|
+
*/
|
|
834
|
+
|
|
835
|
+
interface EcosystemConfig {
|
|
836
|
+
name: string;
|
|
837
|
+
/** Las capacidades que lo componen, ya construidas. */
|
|
838
|
+
capabilities: Capability[];
|
|
839
|
+
/**
|
|
840
|
+
* Reglas por patrón, aplicadas SOBRE lo que cada capacidad declare.
|
|
841
|
+
*
|
|
842
|
+
* Se admite `*` al final: `'delete_*'`. Sirve para poner una regla de casa
|
|
843
|
+
* —"nada que borre corre solo"— sin revisar herramienta por herramienta
|
|
844
|
+
* cuando conectas un servidor con treinta.
|
|
845
|
+
*/
|
|
846
|
+
authority?: Record<string, Authority> | undefined;
|
|
847
|
+
}
|
|
848
|
+
interface Ecosystem {
|
|
849
|
+
readonly name: string;
|
|
850
|
+
/** Todas las herramientas, con su capacidad de origen. */
|
|
851
|
+
readonly tools: (ToolDef & {
|
|
852
|
+
capability: string;
|
|
853
|
+
})[];
|
|
854
|
+
/** Ejecuta buscando en qué capacidad vive esa herramienta. */
|
|
855
|
+
run(call: CapabilityCall): Promise<CapabilityResult>;
|
|
856
|
+
/** Quita una capacidad en caliente. */
|
|
857
|
+
remove(capabilityId: string): Promise<void>;
|
|
858
|
+
/** Agrega una capacidad en caliente. */
|
|
859
|
+
add(capability: Capability): void;
|
|
860
|
+
dispose(): Promise<void>;
|
|
861
|
+
}
|
|
862
|
+
declare function defineEcosystem(cfg: EcosystemConfig): Ecosystem;
|
|
863
|
+
/**
|
|
864
|
+
* Función de modelo. La pone el desarrollador.
|
|
865
|
+
*
|
|
866
|
+
* Recibe el mensaje del usuario y las herramientas disponibles; devuelve texto
|
|
867
|
+
* o una acción a ejecutar. El SDK no sabe ni le importa qué hay detrás.
|
|
868
|
+
*/
|
|
869
|
+
type ModelFn = (input: {
|
|
870
|
+
message: string;
|
|
871
|
+
tools: {
|
|
872
|
+
name: string;
|
|
873
|
+
description: string;
|
|
874
|
+
}[];
|
|
875
|
+
history: {
|
|
876
|
+
role: 'user' | 'agent';
|
|
877
|
+
text: string;
|
|
878
|
+
}[];
|
|
879
|
+
lastResult?: CapabilityResult | undefined;
|
|
880
|
+
}) => Promise<{
|
|
881
|
+
text?: string;
|
|
882
|
+
action?: {
|
|
883
|
+
name: string;
|
|
884
|
+
args?: Record<string, unknown>;
|
|
885
|
+
};
|
|
886
|
+
}>;
|
|
887
|
+
interface AgentLoopOptions {
|
|
888
|
+
ecosystem: Ecosystem;
|
|
889
|
+
model: ModelFn;
|
|
890
|
+
/**
|
|
891
|
+
* Cómo se pide el visto bueno humano. Si no se define, lo que requiera
|
|
892
|
+
* aprobación simplemente no se ejecuta — que es el comportamiento seguro.
|
|
893
|
+
*/
|
|
894
|
+
onApproval?: ((tool: string, args: Record<string, unknown>) => Promise<boolean>) | undefined;
|
|
895
|
+
/** Tope de vueltas. Un agente sin tope es una factura sin tope. */
|
|
896
|
+
maxSteps?: number | undefined;
|
|
897
|
+
}
|
|
898
|
+
interface AgentTurn {
|
|
899
|
+
text?: string | undefined;
|
|
900
|
+
steps: {
|
|
901
|
+
action: string;
|
|
902
|
+
ok: boolean;
|
|
903
|
+
error?: string | undefined;
|
|
904
|
+
}[];
|
|
905
|
+
}
|
|
906
|
+
/**
|
|
907
|
+
* Corre un turno completo: el modelo decide, la autoridad revisa, la capacidad
|
|
908
|
+
* ejecuta, y el resultado vuelve al modelo para que cierre.
|
|
909
|
+
*
|
|
910
|
+
* Con esto alguien se arma un agente entero sin tocar ninguna plataforma.
|
|
911
|
+
*/
|
|
912
|
+
declare function agentLoop(opts: AgentLoopOptions): Promise<(message: string, history?: {
|
|
913
|
+
role: "user" | "agent";
|
|
914
|
+
text: string;
|
|
915
|
+
}[]) => Promise<AgentTurn>>;
|
|
916
|
+
|
|
917
|
+
/**
|
|
918
|
+
* Puente con MCP (Model Context Protocol), en las dos direcciones.
|
|
919
|
+
*
|
|
920
|
+
* MCP ganó como estándar para conectar agentes con herramientas: es lo que
|
|
921
|
+
* usan Anthropic, OpenAI y Google, y hay miles de servidores ya escritos.
|
|
922
|
+
* Pelearse con él sería quedarse solo; el camino es envolverlo.
|
|
923
|
+
*
|
|
924
|
+
* ── Por qué esto no es "adoptar MCP y ya" ────────────────────────────────
|
|
925
|
+
* MCP describe QUÉ puede hacer una herramienta. No sabe decir HASTA DÓNDE:
|
|
926
|
+
* no tiene forma de expresar "hasta $500 solo, arriba pregunta, y nunca
|
|
927
|
+
* borrar". Esa es una carencia reconocida del protocolo, no una opinión.
|
|
928
|
+
*
|
|
929
|
+
* Entonces el reparto queda así:
|
|
930
|
+
* MCP → el catálogo y el transporte. Lo que ya funciona, se reutiliza.
|
|
931
|
+
* VAIA → la autoridad, el consentimiento y la evidencia. Lo que falta.
|
|
932
|
+
*
|
|
933
|
+
* Una herramienta MCP importada entra SIN autoridad, y así no puede
|
|
934
|
+
* ejecutarse: hay que asignársela explícitamente. Es a propósito — importar
|
|
935
|
+
* algo de internet no debería dar permisos por el hecho de importarlo.
|
|
936
|
+
*/
|
|
937
|
+
|
|
938
|
+
/** Esquema JSON de los argumentos, tal como lo publica un servidor MCP. */
|
|
939
|
+
interface MCPInputSchema {
|
|
940
|
+
type: 'object';
|
|
941
|
+
properties?: Record<string, {
|
|
942
|
+
type?: string;
|
|
943
|
+
description?: string;
|
|
944
|
+
enum?: string[];
|
|
945
|
+
}> | undefined;
|
|
946
|
+
required?: string[] | undefined;
|
|
947
|
+
}
|
|
948
|
+
interface MCPTool {
|
|
949
|
+
name: string;
|
|
950
|
+
description?: string | undefined;
|
|
951
|
+
inputSchema?: MCPInputSchema | undefined;
|
|
952
|
+
/** Pistas del servidor sobre si la herramienta destruye o no. */
|
|
953
|
+
annotations?: {
|
|
954
|
+
readOnlyHint?: boolean | undefined;
|
|
955
|
+
destructiveHint?: boolean | undefined;
|
|
956
|
+
idempotentHint?: boolean | undefined;
|
|
957
|
+
} | undefined;
|
|
958
|
+
}
|
|
959
|
+
/**
|
|
960
|
+
* Convierte una herramienta MCP en una declaración VAIA.
|
|
961
|
+
*
|
|
962
|
+
* La autoridad se pide aparte y es obligatoria: el servidor MCP describe lo
|
|
963
|
+
* que sabe hacer, pero **quién decide hasta dónde puede llegar es el dueño de
|
|
964
|
+
* la plataforma, no el servidor**. Confiar en lo que el propio servidor diga
|
|
965
|
+
* de sí mismo sería dejar que quien se importa se autoconceda permisos.
|
|
966
|
+
*
|
|
967
|
+
* Las pistas del servidor se usan solo para AVISAR de incoherencias, nunca
|
|
968
|
+
* para decidir.
|
|
969
|
+
*/
|
|
970
|
+
declare function fromMCPTool(tool: MCPTool, authority: Authority, permission: string): {
|
|
971
|
+
tool: ToolDef;
|
|
972
|
+
warnings: string[];
|
|
973
|
+
};
|
|
974
|
+
/**
|
|
975
|
+
* Publica una herramienta VAIA como herramienta MCP.
|
|
976
|
+
*
|
|
977
|
+
* Se rellenan las pistas a partir de la autoridad declarada, para que del otro
|
|
978
|
+
* lado sepan a qué atenerse. Y algo importante: **lo que requiere aprobación o
|
|
979
|
+
* está prohibido no se publica**. Exponerlo por MCP sería ofrecerle a un
|
|
980
|
+
* agente externo algo que ni el propio dueño puede ejecutar solo.
|
|
981
|
+
*/
|
|
982
|
+
declare function toMCPTool(tool: ToolDef): MCPTool | null;
|
|
983
|
+
/** Publica un conjunto, descartando lo que no debe salir. */
|
|
984
|
+
declare function toMCPTools(tools: ToolDef[]): {
|
|
985
|
+
published: MCPTool[];
|
|
986
|
+
withheld: string[];
|
|
987
|
+
};
|
|
988
|
+
|
|
507
989
|
/**
|
|
508
990
|
* @vaia/sdk — VAIA Platform Integration SDK
|
|
509
991
|
*
|
|
@@ -518,4 +1000,4 @@ declare function toManifest(config: CapabilityConfig): VAIAManifest;
|
|
|
518
1000
|
declare const gandia: typeof _gandia;
|
|
519
1001
|
declare const handeia: typeof _handeia;
|
|
520
1002
|
|
|
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 };
|
|
1003
|
+
export { type ActionPayload, type ActionResponse, AgentAction, type AgentDef, type AgentLoopOptions, AgentSurfaceConfig, type AgentTurn, type AuditRecord, type Authority, type AuthorityLevel, type Capability, type CapabilityCall, type CapabilityConfig, type CapabilityResult, type CardPayload, type CardResponse, 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 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, requiresApproval, toMCPTool, toMCPTools, toManifest, validatePieces };
|