@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/dist/index.d.cts CHANGED
@@ -1,3 +1,166 @@
1
+ import { A as AgentSurfaceConfig, a as AgentAction } from './agent-1bVw0eB8.cjs';
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.cjs';
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 GAIA on every invoke call to the developer's server. */
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 HAIA wants to render — determines which respond.* to use. */
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 HAIA on every invoke call to the developer's server. */
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 HAIA wants to render. */
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 };