@kadi.build/core 0.0.1-alpha.1 → 0.0.1-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1387 -214
- package/dist/abilities/AbilityCache.d.ts +242 -0
- package/dist/abilities/AbilityCache.d.ts.map +1 -0
- package/dist/abilities/AbilityCache.js +285 -0
- package/dist/abilities/AbilityCache.js.map +1 -0
- package/dist/abilities/AbilityContext.d.ts +215 -0
- package/dist/abilities/AbilityContext.d.ts.map +1 -0
- package/dist/abilities/AbilityContext.js +36 -0
- package/dist/abilities/AbilityContext.js.map +1 -0
- package/dist/abilities/AbilityLoader.d.ts +177 -0
- package/dist/abilities/AbilityLoader.d.ts.map +1 -0
- package/dist/abilities/AbilityLoader.js +277 -0
- package/dist/abilities/AbilityLoader.js.map +1 -0
- package/dist/abilities/AbilityProxy.d.ts +463 -0
- package/dist/abilities/AbilityProxy.d.ts.map +1 -0
- package/dist/abilities/AbilityProxy.js +511 -0
- package/dist/abilities/AbilityProxy.js.map +1 -0
- package/dist/abilities/AbilityValidator.d.ts +172 -0
- package/dist/abilities/AbilityValidator.d.ts.map +1 -0
- package/dist/abilities/AbilityValidator.js +253 -0
- package/dist/abilities/AbilityValidator.js.map +1 -0
- package/dist/abilities/index.d.ts +26 -0
- package/dist/abilities/index.d.ts.map +1 -0
- package/dist/abilities/index.js +23 -0
- package/dist/abilities/index.js.map +1 -0
- package/dist/abilities/types.d.ts +156 -0
- package/dist/abilities/types.d.ts.map +1 -0
- package/dist/abilities/types.js +10 -0
- package/dist/abilities/types.js.map +1 -0
- package/dist/api/index.d.ts +92 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +124 -0
- package/dist/api/index.js.map +1 -0
- package/dist/broker/BrokerConnection.d.ts +253 -0
- package/dist/broker/BrokerConnection.d.ts.map +1 -0
- package/dist/broker/BrokerConnection.js +434 -0
- package/dist/broker/BrokerConnection.js.map +1 -0
- package/dist/broker/BrokerConnectionManager.d.ts +216 -0
- package/dist/broker/BrokerConnectionManager.d.ts.map +1 -0
- package/dist/broker/BrokerConnectionManager.js +305 -0
- package/dist/broker/BrokerConnectionManager.js.map +1 -0
- package/dist/broker/BrokerProtocol.d.ts +280 -0
- package/dist/broker/BrokerProtocol.d.ts.map +1 -0
- package/dist/broker/BrokerProtocol.js +466 -0
- package/dist/broker/BrokerProtocol.js.map +1 -0
- package/dist/broker/index.d.ts +9 -0
- package/dist/broker/index.d.ts.map +1 -0
- package/dist/broker/index.js +9 -0
- package/dist/broker/index.js.map +1 -0
- package/dist/client/KadiClient.d.ts +270 -0
- package/dist/client/KadiClient.d.ts.map +1 -0
- package/dist/client/KadiClient.js +492 -0
- package/dist/client/KadiClient.js.map +1 -0
- package/dist/client/index.d.ts +7 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +7 -0
- package/dist/client/index.js.map +1 -0
- package/dist/config/ConfigLoader.d.ts +138 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +226 -0
- package/dist/config/ConfigLoader.js.map +1 -0
- package/dist/config/ConfigResolver.d.ts +135 -0
- package/dist/config/ConfigResolver.d.ts.map +1 -0
- package/dist/config/ConfigResolver.js +282 -0
- package/dist/config/ConfigResolver.js.map +1 -0
- package/dist/config/index.d.ts +8 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +8 -0
- package/dist/config/index.js.map +1 -0
- package/dist/errors/index.d.ts +9 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +8 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/events/EventHub.d.ts +172 -0
- package/dist/events/EventHub.d.ts.map +1 -0
- package/dist/events/EventHub.js +333 -0
- package/dist/events/EventHub.js.map +1 -0
- package/dist/events/index.d.ts +7 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +7 -0
- package/dist/events/index.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/messages/index.d.ts +33 -0
- package/dist/messages/index.d.ts.map +1 -0
- package/dist/messages/index.js +33 -0
- package/dist/messages/index.js.map +1 -0
- package/dist/schemas/index.d.ts +19 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +25 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/kadi-extensions.d.ts +231 -0
- package/dist/schemas/kadi-extensions.d.ts.map +1 -0
- package/dist/schemas/kadi-extensions.js +14 -0
- package/dist/schemas/kadi-extensions.js.map +1 -0
- package/dist/schemas/mcp/schema.d.ts +1399 -0
- package/dist/schemas/mcp/schema.d.ts.map +1 -0
- package/dist/schemas/mcp/schema.js +53 -0
- package/dist/schemas/mcp/schema.js.map +1 -0
- package/dist/schemas/mcp/version.d.ts +37 -0
- package/dist/schemas/mcp/version.d.ts.map +1 -0
- package/dist/schemas/mcp/version.js +39 -0
- package/dist/schemas/mcp/version.js.map +1 -0
- package/dist/schemas/schema-builders.d.ts +178 -0
- package/dist/schemas/schema-builders.d.ts.map +1 -0
- package/dist/schemas/schema-builders.js +258 -0
- package/dist/schemas/schema-builders.js.map +1 -0
- package/dist/tools/ToolRegistry.d.ts +256 -0
- package/dist/tools/ToolRegistry.d.ts.map +1 -0
- package/dist/tools/ToolRegistry.js +340 -0
- package/dist/tools/ToolRegistry.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +7 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/transports/BrokerTransport.d.ts +151 -0
- package/dist/transports/BrokerTransport.d.ts.map +1 -0
- package/dist/transports/BrokerTransport.js +261 -0
- package/dist/transports/BrokerTransport.js.map +1 -0
- package/dist/transports/NativeTransport.d.ts +149 -0
- package/dist/transports/NativeTransport.d.ts.map +1 -0
- package/dist/transports/NativeTransport.js +302 -0
- package/dist/transports/NativeTransport.js.map +1 -0
- package/dist/transports/StdioTransport.d.ts +172 -0
- package/dist/transports/StdioTransport.d.ts.map +1 -0
- package/dist/transports/StdioTransport.js +410 -0
- package/dist/transports/StdioTransport.js.map +1 -0
- package/dist/transports/index.d.ts +10 -0
- package/dist/transports/index.d.ts.map +1 -0
- package/dist/transports/index.js +9 -0
- package/dist/transports/index.js.map +1 -0
- package/dist/types/broker.d.ts +301 -0
- package/dist/types/broker.d.ts.map +1 -0
- package/dist/types/broker.js +46 -0
- package/dist/types/broker.js.map +1 -0
- package/dist/types/config.d.ts +325 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +17 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/errors.d.ts +178 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +165 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/events.d.ts +210 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +8 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +32 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/protocol.d.ts +48 -0
- package/dist/types/protocol.d.ts.map +1 -0
- package/dist/types/protocol.js +11 -0
- package/dist/types/protocol.js.map +1 -0
- package/dist/types/tools.d.ts +67 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +16 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/types/transport.d.ts +250 -0
- package/dist/types/transport.d.ts.map +1 -0
- package/dist/types/transport.js +18 -0
- package/dist/types/transport.js.map +1 -0
- package/dist/validation/SchemaValidator.d.ts +208 -0
- package/dist/validation/SchemaValidator.d.ts.map +1 -0
- package/dist/validation/SchemaValidator.js +411 -0
- package/dist/validation/SchemaValidator.js.map +1 -0
- package/dist/validation/index.d.ts +11 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +10 -0
- package/dist/validation/index.js.map +1 -0
- package/package.json +69 -5
- package/agent.json +0 -18
- package/broker.js +0 -214
- package/index.js +0 -370
- package/ipc.js +0 -220
- package/ipcInterfaces/pythonAbilityIPC.py +0 -177
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KADI Client
|
|
3
|
+
*
|
|
4
|
+
* Thin orchestrator that composes specialized modules to provide the
|
|
5
|
+
* complete KADI client functionality.
|
|
6
|
+
*
|
|
7
|
+
* This is dramatically simpler than the old implementation because each
|
|
8
|
+
* concern has been properly separated.
|
|
9
|
+
*
|
|
10
|
+
* @module client/KadiClient
|
|
11
|
+
*/
|
|
12
|
+
import { EventEmitter } from 'events';
|
|
13
|
+
import { KadiError, ErrorCode } from '../types/index.js';
|
|
14
|
+
import { KadiMessages } from '../messages/index.js';
|
|
15
|
+
import { ConfigResolver } from '../config/ConfigResolver.js';
|
|
16
|
+
import { ToolRegistry } from '../tools/ToolRegistry.js';
|
|
17
|
+
import { EventHub } from '../events/EventHub.js';
|
|
18
|
+
import { BrokerConnectionManager } from '../broker/BrokerConnectionManager.js';
|
|
19
|
+
import { BrokerProtocol, PROTOCOL_VERSION } from '../broker/BrokerProtocol.js';
|
|
20
|
+
import { AbilityLoader } from '../abilities/index.js';
|
|
21
|
+
/**
|
|
22
|
+
* KADI Client
|
|
23
|
+
*
|
|
24
|
+
* Main client class for KADI framework.
|
|
25
|
+
* Orchestrates tool registry, event hub, broker connections, and ability loading.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* // Create client
|
|
30
|
+
* const client = new KadiClient({
|
|
31
|
+
* name: 'my-service',
|
|
32
|
+
* brokers: { local: 'ws://localhost:8080' },
|
|
33
|
+
* networks: ['global']
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* // Register a tool
|
|
37
|
+
* client.registerTool('greet', async ({ name }) => {
|
|
38
|
+
* return { message: `Hello, ${name}!` };
|
|
39
|
+
* });
|
|
40
|
+
*
|
|
41
|
+
* // Connect to brokers
|
|
42
|
+
* await client.connect();
|
|
43
|
+
*
|
|
44
|
+
* // Load an ability (explicit transport)
|
|
45
|
+
* const calc = await client.load('calculator', 'broker');
|
|
46
|
+
* const result = await calc.add({ a: 5, b: 3 });
|
|
47
|
+
*
|
|
48
|
+
* // Subscribe to events
|
|
49
|
+
* client.subscribeToEvent('user.*', (data) => {
|
|
50
|
+
* console.log('User event:', data);
|
|
51
|
+
* });
|
|
52
|
+
*
|
|
53
|
+
* // Publish an event
|
|
54
|
+
* client.publishEvent('user.login', { userId: '123' });
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export class KadiClient extends EventEmitter {
|
|
58
|
+
/**
|
|
59
|
+
* Resolved configuration
|
|
60
|
+
*/
|
|
61
|
+
config;
|
|
62
|
+
/**
|
|
63
|
+
* Tool registry
|
|
64
|
+
*/
|
|
65
|
+
tools;
|
|
66
|
+
/**
|
|
67
|
+
* Event hub
|
|
68
|
+
*/
|
|
69
|
+
events;
|
|
70
|
+
/**
|
|
71
|
+
* Broker connection manager
|
|
72
|
+
*/
|
|
73
|
+
brokers;
|
|
74
|
+
/**
|
|
75
|
+
* Broker protocol instances (per broker)
|
|
76
|
+
*/
|
|
77
|
+
protocols = new Map();
|
|
78
|
+
/**
|
|
79
|
+
* Ability loader
|
|
80
|
+
*/
|
|
81
|
+
abilityLoader;
|
|
82
|
+
/**
|
|
83
|
+
* Whether client is initialized
|
|
84
|
+
*/
|
|
85
|
+
initialized = false;
|
|
86
|
+
/**
|
|
87
|
+
* Create a new KADI Client
|
|
88
|
+
*
|
|
89
|
+
* @param config - Client configuration
|
|
90
|
+
*/
|
|
91
|
+
constructor(config) {
|
|
92
|
+
super();
|
|
93
|
+
// Initialize specialized modules
|
|
94
|
+
this.tools = new ToolRegistry();
|
|
95
|
+
this.events = new EventHub('unknown'); // Will be updated after config resolution
|
|
96
|
+
this.brokers = new BrokerConnectionManager();
|
|
97
|
+
this.abilityLoader = new AbilityLoader();
|
|
98
|
+
// Resolve configuration (synchronous placeholder - will be async in connect())
|
|
99
|
+
// For now, create a minimal config
|
|
100
|
+
this.config = this.createMinimalConfig(config);
|
|
101
|
+
// Update event hub source to match client name
|
|
102
|
+
this.events.setSource(this.config.name);
|
|
103
|
+
// Forward broker events
|
|
104
|
+
this.setupBrokerEventForwarding();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Connect to configured brokers
|
|
108
|
+
*
|
|
109
|
+
* @throws {KadiError} If connection fails
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```typescript
|
|
113
|
+
* await client.connect();
|
|
114
|
+
* console.log('Connected to brokers');
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
async connect() {
|
|
118
|
+
if (this.initialized) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// Resolve full configuration
|
|
122
|
+
const resolver = new ConfigResolver();
|
|
123
|
+
const resolved = await resolver.resolve(this.config);
|
|
124
|
+
Object.assign(this.config, resolved);
|
|
125
|
+
// Connect to brokers if configured
|
|
126
|
+
if (this.config.brokers && Object.keys(this.config.brokers).length > 0) {
|
|
127
|
+
await this.connectToBrokers();
|
|
128
|
+
}
|
|
129
|
+
this.initialized = true;
|
|
130
|
+
this.emit('ready');
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Connect to all configured brokers
|
|
134
|
+
*/
|
|
135
|
+
async connectToBrokers() {
|
|
136
|
+
if (!this.config.brokers) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const brokerConfigs = Object.entries(this.config.brokers).map(([name, url]) => ({
|
|
140
|
+
name,
|
|
141
|
+
url,
|
|
142
|
+
heartbeatInterval: this.config.advanced.heartbeatInterval,
|
|
143
|
+
requestTimeout: this.config.advanced.requestTimeout,
|
|
144
|
+
connectionTimeout: this.config.advanced.connectionTimeout
|
|
145
|
+
}));
|
|
146
|
+
// Connect to all brokers
|
|
147
|
+
await this.brokers.connectMultiple(brokerConfigs, this.config.defaultBroker);
|
|
148
|
+
// Perform handshake and register capabilities for each broker
|
|
149
|
+
for (const brokerName of this.brokers.getBrokerNames()) {
|
|
150
|
+
const connection = this.brokers.getConnection(brokerName);
|
|
151
|
+
if (!connection) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
// Create protocol instance
|
|
155
|
+
const protocol = new BrokerProtocol(connection);
|
|
156
|
+
this.protocols.set(brokerName, protocol);
|
|
157
|
+
// Perform handshake
|
|
158
|
+
await protocol.handshake({
|
|
159
|
+
role: this.config.role || 'agent',
|
|
160
|
+
name: this.config.name,
|
|
161
|
+
version: this.config.version,
|
|
162
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
163
|
+
networks: this.config.networks
|
|
164
|
+
});
|
|
165
|
+
// Register capabilities
|
|
166
|
+
await this.registerCapabilitiesWithBroker(protocol);
|
|
167
|
+
// Start heartbeat
|
|
168
|
+
protocol.startHeartbeat(this.config.advanced.heartbeatInterval ?? 30000);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Register capabilities with a broker
|
|
173
|
+
*
|
|
174
|
+
* @param protocol - Broker protocol instance
|
|
175
|
+
*/
|
|
176
|
+
async registerCapabilitiesWithBroker(protocol) {
|
|
177
|
+
const toolDefinitions = this.tools.extractDefinitions();
|
|
178
|
+
if (toolDefinitions.length > 0) {
|
|
179
|
+
await protocol.registerCapabilities({
|
|
180
|
+
tools: toolDefinitions,
|
|
181
|
+
networks: this.config.networks,
|
|
182
|
+
displayName: this.config.name
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Register a tool (MCP-based)
|
|
188
|
+
*
|
|
189
|
+
* @template TInput - Tool input type
|
|
190
|
+
* @template TOutput - Tool output type
|
|
191
|
+
* @param definition - MCP-compliant tool definition
|
|
192
|
+
* @param handler - Tool handler function
|
|
193
|
+
* @returns this for chaining
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* ```typescript
|
|
197
|
+
* client.registerTool({
|
|
198
|
+
* name: 'add',
|
|
199
|
+
* description: 'Add two numbers',
|
|
200
|
+
* version: '1.0.0',
|
|
201
|
+
* tags: ['math'],
|
|
202
|
+
* inputSchema: {
|
|
203
|
+
* type: 'object',
|
|
204
|
+
* properties: {
|
|
205
|
+
* a: { type: 'number' },
|
|
206
|
+
* b: { type: 'number' }
|
|
207
|
+
* },
|
|
208
|
+
* required: ['a', 'b']
|
|
209
|
+
* },
|
|
210
|
+
* outputSchema: {
|
|
211
|
+
* type: 'object',
|
|
212
|
+
* properties: {
|
|
213
|
+
* result: { type: 'number' }
|
|
214
|
+
* }
|
|
215
|
+
* }
|
|
216
|
+
* }, async ({ a, b }) => {
|
|
217
|
+
* return { result: a + b };
|
|
218
|
+
* });
|
|
219
|
+
* ```
|
|
220
|
+
*/
|
|
221
|
+
registerTool(definition, handler) {
|
|
222
|
+
this.tools.register(definition, handler);
|
|
223
|
+
// If already connected to brokers, register the new tool
|
|
224
|
+
if (this.initialized && this.protocols.size > 0) {
|
|
225
|
+
for (const protocol of this.protocols.values()) {
|
|
226
|
+
protocol.registerCapabilities({
|
|
227
|
+
tools: [definition],
|
|
228
|
+
networks: this.config.networks,
|
|
229
|
+
displayName: this.config.name
|
|
230
|
+
}).catch(error => {
|
|
231
|
+
this.emit('error', new KadiError(`Failed to register tool with broker: ${error instanceof Error ? error.message : String(error)}`, ErrorCode.BROKER_RESPONSE_ERROR, 500, { toolName: definition.name }));
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return this;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Load an ability
|
|
239
|
+
*
|
|
240
|
+
* **Explicit Transport, Excellent Developer Experience:**
|
|
241
|
+
* - Explicit transport selection (no magic)
|
|
242
|
+
* - Transport-specific options (only relevant fields shown)
|
|
243
|
+
* - Smart caching (avoids duplicate loads)
|
|
244
|
+
* - Runtime validation (optional)
|
|
245
|
+
* - Helpful errors with suggestions
|
|
246
|
+
*
|
|
247
|
+
* @param name - Ability name
|
|
248
|
+
* @param transport - Transport type ('native', 'stdio', or 'broker')
|
|
249
|
+
* @param options - Load options (transport-specific, optional)
|
|
250
|
+
* @returns Proxied ability with dynamic method access
|
|
251
|
+
*
|
|
252
|
+
* @throws {KadiError} If loading fails
|
|
253
|
+
*
|
|
254
|
+
* @example
|
|
255
|
+
* ```typescript
|
|
256
|
+
* // Simple broker load
|
|
257
|
+
* const calc = await client.load('calculator', 'broker');
|
|
258
|
+
* await calc.add({ a: 5, b: 3 });
|
|
259
|
+
*
|
|
260
|
+
* // With options
|
|
261
|
+
* const remote = await client.load('gpu-service', 'broker', {
|
|
262
|
+
* networks: ['global', 'gpu-cluster']
|
|
263
|
+
* });
|
|
264
|
+
*
|
|
265
|
+
* // With runtime validation
|
|
266
|
+
* const validated = await client.load('calculator', 'broker', {
|
|
267
|
+
* validate: true // Runtime check for expected methods
|
|
268
|
+
* });
|
|
269
|
+
*
|
|
270
|
+
* // Native transport
|
|
271
|
+
* const local = await client.load('math-lib', 'native', {
|
|
272
|
+
* path: './abilities/math'
|
|
273
|
+
* });
|
|
274
|
+
* ```
|
|
275
|
+
*/
|
|
276
|
+
async load(name, transport, options = {}) {
|
|
277
|
+
return await this.abilityLoader.load(name, transport, options, this);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Subscribe to events
|
|
281
|
+
*
|
|
282
|
+
* @template T - Event data type
|
|
283
|
+
* @param pattern - Event pattern (supports wildcards)
|
|
284
|
+
* @param callback - Event callback
|
|
285
|
+
* @returns Unsubscribe function
|
|
286
|
+
*
|
|
287
|
+
* @example
|
|
288
|
+
* ```typescript
|
|
289
|
+
* const unsubscribe = client.subscribeToEvent('user.*', (data) => {
|
|
290
|
+
* console.log('User event:', data);
|
|
291
|
+
* });
|
|
292
|
+
*
|
|
293
|
+
* // Later...
|
|
294
|
+
* unsubscribe();
|
|
295
|
+
* ```
|
|
296
|
+
*/
|
|
297
|
+
subscribeToEvent(pattern, callback) {
|
|
298
|
+
// Subscribe locally
|
|
299
|
+
const localUnsub = this.events.subscribe(pattern, callback);
|
|
300
|
+
// Subscribe on broker if connected
|
|
301
|
+
if (this.protocols.size > 0) {
|
|
302
|
+
const protocol = this.getBrokerProtocol();
|
|
303
|
+
protocol.subscribeToEvents({
|
|
304
|
+
channels: [pattern],
|
|
305
|
+
networkId: this.config.networks[0]
|
|
306
|
+
}).catch(error => {
|
|
307
|
+
this.emit('error', new KadiError(`Failed to subscribe to broker events: ${error instanceof Error ? error.message : String(error)}`, ErrorCode.EVENT_SUBSCRIPTION_FAILED, 500, { pattern }));
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
return localUnsub;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Publish an event
|
|
314
|
+
*
|
|
315
|
+
* @template T - Event data type
|
|
316
|
+
* @param eventName - Event name
|
|
317
|
+
* @param data - Event data
|
|
318
|
+
* @param options - Publishing options
|
|
319
|
+
*
|
|
320
|
+
* @example
|
|
321
|
+
* ```typescript
|
|
322
|
+
* client.publishEvent('user.login', {
|
|
323
|
+
* userId: '123',
|
|
324
|
+
* timestamp: Date.now()
|
|
325
|
+
* });
|
|
326
|
+
* ```
|
|
327
|
+
*/
|
|
328
|
+
publishEvent(eventName, data, options) {
|
|
329
|
+
// Publish locally
|
|
330
|
+
this.events.publish(eventName, data, options);
|
|
331
|
+
// Publish to broker if connected
|
|
332
|
+
if (this.protocols.size > 0) {
|
|
333
|
+
const protocol = this.getBrokerProtocol();
|
|
334
|
+
protocol.publishEvent({
|
|
335
|
+
channel: eventName,
|
|
336
|
+
data,
|
|
337
|
+
networkId: this.config.networks[0],
|
|
338
|
+
hints: options
|
|
339
|
+
}).catch(error => {
|
|
340
|
+
this.emit('error', new KadiError(`Failed to publish event to broker: ${error instanceof Error ? error.message : String(error)}`, ErrorCode.EVENT_PUBLISH_FAILED, 500, { eventName }));
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Disconnect from all brokers and cleanup
|
|
346
|
+
*
|
|
347
|
+
* @example
|
|
348
|
+
* ```typescript
|
|
349
|
+
* await client.disconnect();
|
|
350
|
+
* ```
|
|
351
|
+
*/
|
|
352
|
+
async disconnect() {
|
|
353
|
+
// Stop all broker heartbeats
|
|
354
|
+
for (const protocol of this.protocols.values()) {
|
|
355
|
+
protocol.cleanup();
|
|
356
|
+
}
|
|
357
|
+
// Disconnect from all brokers
|
|
358
|
+
await this.brokers.disconnectAll();
|
|
359
|
+
// Unload all abilities
|
|
360
|
+
await this.abilityLoader.unloadAll();
|
|
361
|
+
// Clear event subscriptions
|
|
362
|
+
this.events.clear();
|
|
363
|
+
// Clear protocols
|
|
364
|
+
this.protocols.clear();
|
|
365
|
+
this.initialized = false;
|
|
366
|
+
this.emit('disconnected');
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Get broker manager (implements IBrokerClient)
|
|
370
|
+
*/
|
|
371
|
+
getBrokerManager() {
|
|
372
|
+
return this.brokers;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Get broker protocol instance (implements IBrokerClient)
|
|
376
|
+
*
|
|
377
|
+
* @param brokerName - Optional broker name (uses default if not specified)
|
|
378
|
+
*/
|
|
379
|
+
getBrokerProtocol(brokerName) {
|
|
380
|
+
const name = brokerName ?? this.brokers.getDefaultBrokerName();
|
|
381
|
+
if (!name) {
|
|
382
|
+
throw new KadiError('No broker available', ErrorCode.BROKER_NOT_CONNECTED, 503);
|
|
383
|
+
}
|
|
384
|
+
const protocol = this.protocols.get(name);
|
|
385
|
+
if (!protocol) {
|
|
386
|
+
throw new KadiError(`Broker protocol not initialized for '${name}'`, ErrorCode.BROKER_NOT_CONNECTED, 503, { brokerName: name });
|
|
387
|
+
}
|
|
388
|
+
return protocol;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Networks (implements IBrokerClient)
|
|
392
|
+
*/
|
|
393
|
+
get networks() {
|
|
394
|
+
return this.config.networks;
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Create minimal configuration for constructor
|
|
398
|
+
* Full resolution happens in connect()
|
|
399
|
+
*/
|
|
400
|
+
createMinimalConfig(config) {
|
|
401
|
+
const normalized = typeof config === 'string'
|
|
402
|
+
? { brokers: { default: config } }
|
|
403
|
+
: config;
|
|
404
|
+
return {
|
|
405
|
+
name: normalized.name ?? 'unnamed-client',
|
|
406
|
+
version: normalized.version ?? '1.0.0',
|
|
407
|
+
description: normalized.description ?? '',
|
|
408
|
+
role: normalized.role ?? 'agent',
|
|
409
|
+
transport: normalized.transport ?? 'native',
|
|
410
|
+
brokers: normalized.brokers ?? { default: '' },
|
|
411
|
+
defaultBroker: normalized.defaultBroker ?? 'default',
|
|
412
|
+
networks: normalized.networks ?? ['global'],
|
|
413
|
+
abilityAgentJSON: normalized.abilityAgentJSON ?? '',
|
|
414
|
+
autoConnect: normalized.autoConnect ?? false,
|
|
415
|
+
advanced: {
|
|
416
|
+
heartbeatInterval: 30000,
|
|
417
|
+
requestTimeout: 30000,
|
|
418
|
+
connectionTimeout: 10000,
|
|
419
|
+
autoReconnect: true,
|
|
420
|
+
maxReconnectAttempts: 5,
|
|
421
|
+
verbose: false
|
|
422
|
+
},
|
|
423
|
+
sources: {}
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Setup broker event forwarding
|
|
428
|
+
*/
|
|
429
|
+
setupBrokerEventForwarding() {
|
|
430
|
+
this.brokers.on('brokerMessage', async (brokerName, message) => {
|
|
431
|
+
if (!message || typeof message !== 'object' || !('method' in message)) {
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
const msg = message;
|
|
435
|
+
// Handle incoming tool invocation requests
|
|
436
|
+
if (msg.method === KadiMessages.ABILITY_REQUEST && msg.params) {
|
|
437
|
+
await this.handleIncomingToolRequest(brokerName, msg);
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
// Handle event deliveries
|
|
441
|
+
if (msg.method === KadiMessages.EVENT_DELIVERY && msg.params) {
|
|
442
|
+
const { channel, data } = msg.params;
|
|
443
|
+
if (channel && data !== undefined) {
|
|
444
|
+
this.events.publish(channel, data);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Handle incoming tool invocation requests from broker
|
|
451
|
+
*
|
|
452
|
+
* Flow:
|
|
453
|
+
* 1. Extract id from top-level message (JSON-RPC request id)
|
|
454
|
+
* 2. Look up tool handler by name
|
|
455
|
+
* 3. Execute handler with toolInput
|
|
456
|
+
* 4. Send JSON-RPC response back to broker with matching id
|
|
457
|
+
*
|
|
458
|
+
* @param brokerName - Name of the broker connection to use for response
|
|
459
|
+
* @param message - Full JSON-RPC request message with id, method, and params
|
|
460
|
+
* @private
|
|
461
|
+
*/
|
|
462
|
+
async handleIncomingToolRequest(brokerName, message) {
|
|
463
|
+
const { toolName, toolInput } = message.params || {};
|
|
464
|
+
const requestId = message.id;
|
|
465
|
+
try {
|
|
466
|
+
// Step 1: Look up the tool handler
|
|
467
|
+
const handler = this.tools.getHandler(toolName);
|
|
468
|
+
if (!handler) {
|
|
469
|
+
throw new KadiError(`Tool '${toolName}' not found`, ErrorCode.TOOL_NOT_FOUND, 404, { toolName });
|
|
470
|
+
}
|
|
471
|
+
// Step 2: Execute the handler
|
|
472
|
+
const result = await handler(toolInput);
|
|
473
|
+
// Step 3: Send JSON-RPC response back to broker
|
|
474
|
+
// CRITICAL: id must match the incoming request id for proper routing
|
|
475
|
+
const connection = this.brokers.getConnection(brokerName);
|
|
476
|
+
if (!connection) {
|
|
477
|
+
console.error(`[DEBUG] No connection found for broker: ${brokerName}`);
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
connection.sendResponse(requestId, result);
|
|
481
|
+
}
|
|
482
|
+
catch (error) {
|
|
483
|
+
// Send JSON-RPC error response back to broker with same id for proper routing
|
|
484
|
+
const connection = this.brokers.getConnection(brokerName);
|
|
485
|
+
if (connection) {
|
|
486
|
+
const kadiError = error instanceof KadiError ? error : KadiError.from(error);
|
|
487
|
+
connection.sendError(requestId, kadiError.code, kadiError.message);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
//# sourceMappingURL=KadiClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KadiClient.js","sourceRoot":"","sources":["../../src/client/KadiClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Loader
|
|
3
|
+
*
|
|
4
|
+
* Loads configuration from various sources:
|
|
5
|
+
* - Environment variables
|
|
6
|
+
* - Configuration files (agent.json, kadi.config.json)
|
|
7
|
+
* - Package.json
|
|
8
|
+
*
|
|
9
|
+
* @module config/ConfigLoader
|
|
10
|
+
*/
|
|
11
|
+
import type { AgentJsonConfig, EnvConfig } from '../types/index.js';
|
|
12
|
+
/**
|
|
13
|
+
* Configuration Loader
|
|
14
|
+
*
|
|
15
|
+
* Handles the actual loading of configuration from files and environment.
|
|
16
|
+
* Separated from ConfigResolver for testability.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const loader = new ConfigLoader();
|
|
21
|
+
*
|
|
22
|
+
* // Load from environment
|
|
23
|
+
* const envConfig = loader.loadFromEnvironment();
|
|
24
|
+
*
|
|
25
|
+
* // Load from file
|
|
26
|
+
* const fileConfig = await loader.loadFromFile();
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare class ConfigLoader {
|
|
30
|
+
/**
|
|
31
|
+
* Configuration file names to search for (in order of preference)
|
|
32
|
+
*/
|
|
33
|
+
private readonly configFiles;
|
|
34
|
+
/**
|
|
35
|
+
* Load configuration from environment variables
|
|
36
|
+
*
|
|
37
|
+
* Reads KADI_* environment variables and returns structured config.
|
|
38
|
+
*
|
|
39
|
+
* @returns Environment configuration
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* // With environment variables:
|
|
44
|
+
* // KADI_BROKER_URL=ws://localhost:8080
|
|
45
|
+
* // KADI_NETWORKS=global,team-alpha
|
|
46
|
+
*
|
|
47
|
+
* const config = loader.loadFromEnvironment();
|
|
48
|
+
* // { KADI_BROKER_URL: 'ws://localhost:8080', KADI_NETWORKS: 'global,team-alpha' }
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
loadFromEnvironment(): EnvConfig;
|
|
52
|
+
/**
|
|
53
|
+
* Load configuration from file
|
|
54
|
+
*
|
|
55
|
+
* Searches for configuration files in order of preference:
|
|
56
|
+
* 1. agent.json
|
|
57
|
+
* 2. kadi.config.json
|
|
58
|
+
* 3. .kadirc.json
|
|
59
|
+
*
|
|
60
|
+
* Searches from current directory up to root.
|
|
61
|
+
*
|
|
62
|
+
* @param startDir - Directory to start searching from (defaults to cwd)
|
|
63
|
+
* @returns Loaded configuration or null if not found
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const config = await loader.loadFromFile();
|
|
68
|
+
* if (config) {
|
|
69
|
+
* console.log('Loaded from:', config.name);
|
|
70
|
+
* }
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
loadFromFile(startDir?: string): Promise<AgentJsonConfig | null>;
|
|
74
|
+
/**
|
|
75
|
+
* Find a configuration file by searching up the directory tree
|
|
76
|
+
*
|
|
77
|
+
* @param filename - Config filename to search for
|
|
78
|
+
* @param startDir - Directory to start searching from
|
|
79
|
+
* @returns Full path to config file or null if not found
|
|
80
|
+
*/
|
|
81
|
+
private findConfigFile;
|
|
82
|
+
/**
|
|
83
|
+
* Load and parse a configuration file
|
|
84
|
+
*
|
|
85
|
+
* @param filePath - Path to configuration file
|
|
86
|
+
* @returns Parsed configuration
|
|
87
|
+
* @throws If file cannot be read or parsed
|
|
88
|
+
*/
|
|
89
|
+
private loadConfigFile;
|
|
90
|
+
/**
|
|
91
|
+
* Load KADI configuration from package.json
|
|
92
|
+
*
|
|
93
|
+
* Looks for a "kadi" field in package.json
|
|
94
|
+
*
|
|
95
|
+
* @param startDir - Directory to start searching from
|
|
96
|
+
* @returns Configuration from package.json or null
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```json
|
|
100
|
+
* // package.json
|
|
101
|
+
* {
|
|
102
|
+
* "name": "my-package",
|
|
103
|
+
* "kadi": {
|
|
104
|
+
* "name": "my-service",
|
|
105
|
+
* "brokers": {
|
|
106
|
+
* "local": "ws://localhost:8080"
|
|
107
|
+
* }
|
|
108
|
+
* }
|
|
109
|
+
* }
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
private loadFromPackageJson;
|
|
113
|
+
/**
|
|
114
|
+
* Parse transport string to TransportKind
|
|
115
|
+
*
|
|
116
|
+
* @param value - Transport string
|
|
117
|
+
* @returns TransportKind or undefined
|
|
118
|
+
*/
|
|
119
|
+
private parseTransport;
|
|
120
|
+
/**
|
|
121
|
+
* Get configuration file path if one exists
|
|
122
|
+
*
|
|
123
|
+
* Useful for debugging and logging which config file is being used.
|
|
124
|
+
*
|
|
125
|
+
* @param startDir - Directory to start searching from
|
|
126
|
+
* @returns Path to config file or null
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* const configPath = loader.getConfigPath();
|
|
131
|
+
* if (configPath) {
|
|
132
|
+
* console.log('Using config from:', configPath);
|
|
133
|
+
* }
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
getConfigPath(startDir?: string): string | null;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=ConfigLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigLoader.d.ts","sourceRoot":"","sources":["../../src/config/ConfigLoader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAiB,MAAM,mBAAmB,CAAC;AAEnF;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,YAAY;IACvB;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAI1B;IAEF;;;;;;;;;;;;;;;;OAgBG;IACH,mBAAmB,IAAI,SAAS;IAUhC;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAoBtE;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAqBtB;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAWtB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAatB;;;;;;;;;;;;;;;OAeG;IACH,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAYhD"}
|