@kernel.chat/kbot 3.13.1 → 3.14.5

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.
@@ -0,0 +1,132 @@
1
+ `` `typescript
2
+ export class MCPClient {
3
+ private connectedServers: Map<string, string> = new Map();
4
+
5
+ async discoverServers(): Promise<string[]> {
6
+ // Discover available MCP servers from known registries
7
+ const servers = [
8
+ "cablate/mcp-google-map",
9
+ "jackwener/opencli",
10
+ "vm0-ai/vm0",
11
+ ];
12
+
13
+ return servers;
14
+ }
15
+
16
+ async connect(serverId: string): Promise<boolean> {
17
+ // Connect to an MCP server via stdin/stdout protocol
18
+ if (!this.connectedServers.has(serverId)) {
19
+ this.connectedServers.set(serverId, serverId);
20
+ return true;
21
+ }
22
+ return false;
23
+ }
24
+
25
+ async invokeTool(serverId: string, toolName: string, args: Record<string, unknown>): Promise<unknown> {
26
+ // MCP protocol: send tool call, receive response
27
+ const protocol: Record<string, unknown> = {
28
+ jsonrpc: "2.0",
29
+ id: Date.now(),
30
+ method: "tools/call",
31
+ params: {
32
+ name: toolName,
33
+ arguments: args,
34
+ },
35
+ };
36
+
37
+ // Serialize and send over MCP channel
38
+ const message = JSON.stringify(protocol);
39
+
40
+ // Receive response (simplified - real MCP uses bidirectional streams)
41
+ return this.handleMCPResponse(serverId, message, protocol.id);
42
+ }
43
+
44
+ async handleMCPResponse(serverId: string, message: string, requestId: number): Promise<unknown> {
45
+ // In real implementation, this would parse MCP server responses
46
+ // For now, we simulate tool execution
47
+ const response: Record<string, unknown> = {
48
+ jsonrpc: "2.0",
49
+ id: requestId,
50
+ result: this.simulateToolExecution(message, serverId),
51
+ };
52
+
53
+ return response;
54
+ }
55
+
56
+ simulateToolExecution(message: string, serverId: string): unknown {
57
+ // Simulate tool execution based on server capabilities
58
+ // This would be replaced with actual MCP protocol implementation
59
+
60
+ if (serverId.includes("google-map")) {
61
+ // Simulate Maps tool
62
+ return {
63
+ success: true,
64
+ data: {
65
+ location: "Unknown",
66
+ distance: "N/A",
67
+ duration: "N/A",
68
+ note: "Actual Google Maps API integration requires proper MCP server"
69
+ },
70
+ };
71
+ } else if (serverId.includes("opencli")) {
72
+ // Simulate CLI tool
73
+ return {
74
+ success: true,
75
+ data: {
76
+ output: "Tool executed successfully",
77
+ note: "Full CLI transformation requires proper MCP integration"
78
+ },
79
+ };
80
+ } else if (serverId.includes("vm0")) {
81
+ // Simulate workflow tool
82
+ return {
83
+ success: true,
84
+ data: {
85
+ workflow: "executed",
86
+ result: {
87
+ status: "pending",
88
+ note: "Natural language workflow execution requires MCP workflow support"
89
+ },
90
+ },
91
+ };
92
+ }
93
+
94
+ return {
95
+ success: false,
96
+ error: "Unknown MCP server or tool",
97
+ note: "Please implement proper MCP protocol handling",
98
+ };
99
+ }
100
+
101
+ async listTools(serverId: string): Promise<string[]> {
102
+ // List available tools from an MCP server
103
+ const tools = this.getKnownTools(serverId);
104
+ return tools;
105
+ }
106
+
107
+ private getKnownTools(serverId: string): string[] {
108
+ // Define available tools per server
109
+ const toolDefinitions: Record<string, string[]> = {
110
+ "cablate/mcp-google-map": ["maps.search", "maps.directions", "maps.route", "maps.distance"],
111
+ "jackwener/opencli": ["cli.execute", "cli.transform", "cli.interpret"],
112
+ "vm0-ai/vm0": ["workflow.run", "workflow.describe", "workflow.parse"],
113
+ };
114
+
115
+ return toolDefinitions[serverId] || [];
116
+ }
117
+ }
118
+
119
+ // MCP Tool for agent discovery
120
+ export interface MCPTool {
121
+ name: string;
122
+ description: string;
123
+ inputSchema: Record<string, unknown>;
124
+ }
125
+
126
+ // MCP Client provider for dependency injection
127
+ export function createMCPClient(): MCPClient {
128
+ return new MCPClient();
129
+ }
130
+ ` ``;
131
+ export {};
132
+ //# sourceMappingURL=mcp-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../../../../src/packages/kbot/src/tools/mcp-client.ts"],"names":[],"mappings":"AAAA,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiID,CAAA,EAAE,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-discovery.d.ts","sourceRoot":"","sources":["../../../../../src/packages/kbot/src/tools/mcp-discovery.ts"],"names":[],"mappings":""}
@@ -0,0 +1,433 @@
1
+ `` `typescript
2
+ import { z } from "zod";
3
+ import type { Tool, ToolDefinition } from "@kernel.chat/types";
4
+ import { Logger } from "../logger";
5
+
6
+ /**
7
+ * MCP Server Discovery Tool
8
+ *
9
+ * Scans available MCP servers and builds a unified tool registry
10
+ * that agents can route tool calls through dynamically
11
+ */
12
+ export class McpDiscoveryTool implements ToolDefinition {
13
+ name = "mcp_discovery";
14
+ description = "Discover available MCP servers and their tools dynamically. Returns a catalog of all registered MCP servers with their capabilities, tools, and connection status.";
15
+ inputSchema = z.object({
16
+ scope: z
17
+ .enum(["all", "installed", "remote", "system"])
18
+ .default("all")
19
+ .describe(`;
20
+ Filter;
21
+ scope;
22
+ for (discovery; ; )
23
+ : ;
24
+ n - all;
25
+ discover;
26
+ all;
27
+ registered;
28
+ servers;
29
+ n - installed;
30
+ only;
31
+ locally;
32
+ installed;
33
+ servers;
34
+ n - remote;
35
+ servers;
36
+ discovered;
37
+ via;
38
+ network;
39
+ propagation;
40
+ n - system;
41
+ only;
42
+ system - integrated;
43
+ servers `),
44
+ domain: z
45
+ .enum(["maps", "api", "web", "all"])
46
+ .default("all")
47
+ .describe(`;
48
+ Filter;
49
+ by;
50
+ domain: ;
51
+ n - maps;
52
+ Google;
53
+ Maps, routing, geolocation;
54
+ servers;
55
+ n - api;
56
+ web - to - API;
57
+ servers;
58
+ like;
59
+ apitap;
60
+ n - web;
61
+ general;
62
+ web;
63
+ interaction;
64
+ servers;
65
+ n - all;
66
+ no;
67
+ domain;
68
+ filtering `),
69
+ includeMetadata: z
70
+ .boolean()
71
+ .default(true)
72
+ .describe("Include detailed metadata about each server (capabilities, versions, trust scores)"),
73
+ });
74
+
75
+ private logger = new Logger(this.name);
76
+
77
+ async execute(args: z.infer<typeof this.inputSchema>) {
78
+ this.logger.debug(`;
79
+ Starting;
80
+ MCP;
81
+ discovery;
82
+ with (scope = $) {
83
+ args.scope;
84
+ }
85
+ domain = $;
86
+ {
87
+ args.domain;
88
+ }
89
+ `);
90
+
91
+ // Gather all MCP servers from registered managers
92
+ const allServers = await this.discoverServers(args.scope, args.domain, args.includeMetadata);
93
+
94
+ // Build a unified tool registry with routing information
95
+ const toolRegistry = await this.buildRegistry(allServers);
96
+
97
+ // Format response based on scope
98
+ const response = this.formatResponse(toolRegistry, args.scope);
99
+
100
+ this.logger.info(`;
101
+ Discovery;
102
+ complete: $;
103
+ {
104
+ response.totalServers;
105
+ }
106
+ servers, $;
107
+ {
108
+ response.totalTools;
109
+ }
110
+ tools;
111
+ available `);
112
+
113
+ return {
114
+ status: "success",
115
+ timestamp: new ISODateString(),
116
+ data: response,
117
+ };
118
+ }
119
+
120
+ private async discoverServers(
121
+ scope: string,
122
+ domain: string,
123
+ includeMetadata: boolean
124
+ ): Promise<McpServer[]> {
125
+ const discovered: McpServer[] = [];
126
+
127
+ // Registry of MCP server managers
128
+ const mcpManagers = this.getMcpManagers();
129
+
130
+ for (const manager of mcpManagers) {
131
+ if (scope !== "all" && !manager.matchesScope(scope)) {
132
+ continue;
133
+ }
134
+
135
+ // Register the manager's servers
136
+ const registered = await manager.discover();
137
+ for (const server of registered) {
138
+ // Filter by domain if requested
139
+ if (domain !== "all" && !server.matchesDomain(domain)) {
140
+ continue;
141
+ }
142
+
143
+ const serverData = includeMetadata
144
+ ? { ...server, metadata: await this.enrichMetadata(server) }
145
+ : server;
146
+
147
+ discovered.push(serverData);
148
+ }
149
+
150
+ // Propagate discovery if remote scope
151
+ if (scope === "remote" && manager.propagates) {
152
+ await this.propagateDiscovery(manager, discovered);
153
+ }
154
+ }
155
+
156
+ return discovered;
157
+ }
158
+
159
+ private getMcpManagers(): McpManager[] {
160
+ return [
161
+ new ApitapManager(),
162
+ new MapManager(),
163
+ new FileSystemMcpManager(),
164
+ new DatabaseMcpManager(),
165
+ ];
166
+ }
167
+
168
+ private async enrichMetadata(server: McpServer): Promise<ServerMetadata> {
169
+ const trustScore = await this.assessTrust(server);
170
+ return {
171
+ trustScore,
172
+ discoveryTimestamp: new ISODateString(),
173
+ knownTools: server.tools.length,
174
+ capabilities: server.capabilities,
175
+ };
176
+ }
177
+
178
+ private async assessTrust(server: McpServer): Promise<number> {
179
+ // Simple trust scoring based on available signals
180
+ let score = 50; // Base score
181
+
182
+ // Server-specific signals
183
+ if (server.source === "official") score += 20;
184
+ if (server.version && semver.valid(server.version)) score += 10;
185
+ if (server.testedIn) score += 15;
186
+
187
+ // Community signals (would query github, npm, etc. in production)
188
+ if (server.repository && server.repository.stars) {
189
+ score = Math.min(100, score + server.repository.stars / 100);
190
+ }
191
+
192
+ // Cap trust score
193
+ return Math.max(0, Math.min(100, score));
194
+ }
195
+
196
+ private async propagateDiscovery(manager: McpManager, discovered: McpServer[]): Promise<void> {
197
+ if (!manager.propagates) return;
198
+
199
+ // In production, this would propagate via MCP discovery protocol
200
+ // For now, simulate by checking for cross-server dependencies
201
+ for (const server of discovered) {
202
+ if (server.requiresServer && !discovered.find(s => s.name === server.requiresServer)) {
203
+ await this.discoverServers("all", "all", false); // Recursive discovery
204
+ }
205
+ }
206
+ }
207
+
208
+ private async buildRegistry(servers: McpServer[]): Promise<ToolRegistry> {
209
+ const registry: ToolRegistry = {
210
+ servers: new Map(),
211
+ tools: new Map(),
212
+ };
213
+
214
+ for (const server of servers) {
215
+ registry.servers.set(server.name, {
216
+ ...server,
217
+ toolHandlers: new Map<string, McpToolHandler>(),
218
+ });
219
+
220
+ for (const tool of server.tools) {
221
+ const handler = new McpToolHandler(server, tool);
222
+ registry.tools.set(`;
223
+ $;
224
+ {
225
+ server.name;
226
+ }
227
+ $;
228
+ {
229
+ tool.name;
230
+ }
231
+ `, handler);
232
+ registry.servers.get(server.name)?.tools.push(tool);
233
+ }
234
+ }
235
+
236
+ return registry;
237
+ }
238
+
239
+ private formatResponse(registry: ToolRegistry, scope: string): DiscoveryResult {
240
+ const filteredServers = [...registry.servers.values()].filter(
241
+ server => {
242
+ if (scope === "installed") return server.local;
243
+ if (scope === "remote") return !server.local;
244
+ if (scope === "system") return server.systemIntegrated;
245
+ return true;
246
+ }
247
+ );
248
+
249
+ return {
250
+ totalServers: filteredServers.length,
251
+ totalTools: filteredServers.reduce((sum, s) => sum + s.tools.length, 0),
252
+ servers: filteredServers.map(s => ({
253
+ name: s.name,
254
+ description: s.description.substring(0, 200),
255
+ version: s.version,
256
+ tools: s.tools.map(t => ({
257
+ name: t.name,
258
+ description: t.description.substring(0, 300),
259
+ parameters: this.describeParameters(t.inputSchema),
260
+ trustScore: s.metadata?.trustScore ?? "unknown",
261
+ })),
262
+ capabilities: s.metadata?.capabilities ?? { tools: true, resources: false, prompts: false },
263
+ })),
264
+ };
265
+ }
266
+
267
+ private describeParameters(schema: z.ZodSchema): string {
268
+ const required = schema.shape
269
+ .filter(prop => prop.description?.includes("required") || prop.required)
270
+ .map(prop => prop.key)
271
+ .join(", ");
272
+
273
+ const optional = [];
274
+
275
+ return `;
276
+ Required: $;
277
+ {
278
+ required || "none";
279
+ }
280
+ ;
281
+ Optional: $;
282
+ {
283
+ optional.length > 0 ? optional.join(", ") : "none";
284
+ }
285
+ `;
286
+ }
287
+ }
288
+
289
+ /**
290
+ * MCP Tool Handler - Routes tool calls to specific MCP servers
291
+ */
292
+ export class McpToolHandler {
293
+ serverName: string;
294
+ toolName: string;
295
+ inputSchema: z.ZodSchema;
296
+ private logger = new Logger(`;
297
+ mcp: $;
298
+ {
299
+ this.serverName;
300
+ }
301
+ $;
302
+ {
303
+ this.toolName;
304
+ }
305
+ `);
306
+
307
+ constructor(server: McpServer, tool: McpServer["tools"][number]) {
308
+ this.serverName = server.name;
309
+ this.toolName = tool.name;
310
+ this.inputSchema = tool.inputSchema;
311
+ }
312
+
313
+ async execute(args: z.infer<typeof this.inputSchema>): Promise<ToolResult> {
314
+ this.logger.debug(`;
315
+ Executing;
316
+ tool: $;
317
+ {
318
+ this.toolName;
319
+ }
320
+ from;
321
+ server;
322
+ $;
323
+ {
324
+ this.serverName;
325
+ }
326
+ `);
327
+
328
+ // Validate arguments
329
+ const validated = this.inputSchema.safeParse(args);
330
+ if (!validated.success) {
331
+ return {
332
+ status: "error",
333
+ error: "Invalid arguments",
334
+ details: validated.error.errors.map(err => ({
335
+ field: err.path.join("."),
336
+ message: err.message,
337
+ })),
338
+ };
339
+ }
340
+
341
+ // Route to the appropriate MCP server implementation
342
+ // In production, this would use the MCP protocol to send calls to the server process
343
+ const result = await this.delegateToServer(validated.data);
344
+
345
+ return {
346
+ status: "success",
347
+ server: this.serverName,
348
+ tool: this.toolName,
349
+ result: result,
350
+ timestamp: new ISODateString(),
351
+ };
352
+ }
353
+
354
+ private async delegateToServer(args: z.infer<typeof this.inputSchema>): Promise<unknown> {
355
+ // Server-specific delegation logic
356
+ if (this.serverName === "apitap") {
357
+ return await this.apitapDelegate(args);
358
+ } else if (this.serverName === "google-maps") {
359
+ return await this.googleMapsDelegate(args);
360
+ } else {
361
+ // Default handler - would use MCP protocol
362
+ return await this.defaultDelegate(args);
363
+ }
364
+ }
365
+
366
+ private async apitapDelegate(args: any): Promise<any> {
367
+ // Integration with apitap MCP server
368
+ // Transform web queries into API calls
369
+ const url = this.extractUrl(args);
370
+ return { apiCall: url, response: "Simulated API response" };
371
+ }
372
+
373
+ private async googleMapsDelegate(args: any): Promise<any> {
374
+ // Integration with Google Maps MCP server
375
+ const { query, location } = args;
376
+ return { geocode: { query, location } };
377
+ }
378
+
379
+ private async defaultDelegate(args: any): Promise<any> {
380
+ // Generic MCP protocol handler
381
+ return {
382
+ protocol: "MCP",
383
+ server: this.serverName,
384
+ tool: this.toolName,
385
+ args,
386
+ result: "Processed by generic MCP handler",
387
+ };
388
+ }
389
+
390
+ private extractUrl(args: any): string {
391
+ // Extract URL from various possible argument formats
392
+ const urlFields = ["url", "web_url", "target", "destination"];
393
+ for (const field of urlFields) {
394
+ if (args[field]) {
395
+ return String(args[field]);
396
+ }
397
+ }
398
+ return "";
399
+ }
400
+ }
401
+
402
+ /**
403
+ * MCP Server Manager - Base class for discovering MCP servers
404
+ */
405
+ class McpManager {
406
+ name: string;
407
+ local: boolean = true;
408
+ systemIntegrated: boolean = false;
409
+ propagates: boolean = false;
410
+
411
+ abstract discover(): Promise<McpServer[]>;
412
+ abstract matchesScope(scope: string): boolean;
413
+ abstract matchesDomain(domain: string): boolean;
414
+ }
415
+
416
+ /**
417
+ * Apitap Manager - MCP server that turns websites into APIs
418
+ */
419
+ class ApitapManager extends McpManager {
420
+ name = "apitap";
421
+ matchesScope(scope: string): boolean {
422
+ if (scope === "api") return true;
423
+ if (scope === "all") return true;
424
+ return false;
425
+ }
426
+
427
+ matchesDomain(domain: string): boolean {
428
+ return domain === "api" || domain === "web" || domain === "all";
429
+ }
430
+
431
+ async discover(): Promise<McpServer[]> {;
432
+ export {};
433
+ //# sourceMappingURL=mcp-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-discovery.js","sourceRoot":"","sources":["../../../../../src/packages/kbot/src/tools/mcp-discovery.ts"],"names":[],"mappings":"AAAA,EAAE,CAAA;;;;;;;;;;;;;;;;;;iBAkBe,CAAA;AAAA,MAAM,CAAA;AAAC,KAAK,CAAA;AAAC,KAAI,SAAS,EAAA,EAAA;IAAA,EAAC,CAAA;AAAC,CAAC,GAAE,GAAG,CAAA;AAAE,QAAQ,CAAA;AAAC,GAAG,CAAA;AAAC,UAAU,CAAA;AAAC,OAAO,CAAA;AAAC,CAAC,GAAE,SAAS,CAAA;AAAE,IAAI,CAAA;AAAC,OAAO,CAAA;AAAC,SAAS,CAAA;AAAC,OAAO,CAAA;AAAC,CAAC,GAAE,MAAM,CAAA;AAAE,OAAO,CAAA;AAAC,UAAU,CAAA;AAAC,GAAG,CAAA;AAAC,OAAO,CAAA;AAAC,WAAW,CAAA;AAAC,CAAC,GAAE,MAAM,CAAA;AAAE,IAAI,CAAA;AAAC,MAAM,GAAC,UAAU,CAAA;AAAC,OAAO,CAAA;;;;iBAIhN,CAAA;AAAA,MAAM,CAAA;AAAC,EAAE,CAAA;AAAC,MAAM,EAAC,CAAA;AAAC,CAAC,GAAE,IAAI,CAAA;AAAE,MAAM,CAAA;AAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAA;AAAC,OAAO,CAAA;AAAC,CAAC,GAAE,GAAG,CAAA;AAAE,GAAG,GAAC,EAAE,GAAC,GAAG,CAAA;AAAC,OAAO,CAAA;AAAC,IAAI,CAAA;AAAC,MAAM,CAAA;AAAC,CAAC,GAAE,GAAG,CAAA;AAAE,OAAO,CAAA;AAAC,GAAG,CAAA;AAAC,WAAW,CAAA;AAAC,OAAO,CAAA;AAAC,CAAC,GAAE,GAAG,CAAA;AAAE,EAAE,CAAA;AAAC,MAAM,CAAA;AAAC,SAAS,CAAA;;;;;;;;;;uBAUzK,CAAA;AAAA,QAAQ,CAAA;AAAC,GAAG,CAAA;AAAC,SAAS,CAAA;AAAC,MAAK,KAAK,GAAC,CAAC,EAAA,CAAC;IAAA,IAAI,CAAC,KAAK,CAAA;AAAA,CAAC;AAAE,MAAM,GAAC,CAAC,CAAA;AAAA,CAAC;IAAA,IAAI,CAAC,MAAM,CAAA;AAAA,CAAC;AAAA;;;;;;;;;;;sBAWvE,CAAA;AAAA,SAAS,CAAA;AAAC,QAAQ,EAAE,CAAC,CAAA;AAAA,CAAC;IAAA,QAAQ,CAAC,YAAY,CAAA;AAAA,CAAC;AAAC,OAAO,EAAE,CAAC,CAAA;AAAA,CAAC;IAAA,QAAQ,CAAC,UAAU,CAAA;AAAA,CAAC;AAAC,KAAK,CAAA;AAAC,SAAS,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BA+GtF,CAAA;AAAA,CAAC,CAAA;AAAA,CAAC;IAAA,MAAM,CAAC,IAAI,CAAA;AAAA,CAAC;AAAC,CAAC,CAAA;AAAA,CAAC;IAAA,IAAI,CAAC,IAAI,CAAA;AAAA,CAAC;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YA4C3C,CAAA;AAAA,QAAQ,EAAE,CAAC,CAAA;AAAA,CAAC;IAAA,QAAQ,IAAI,MAAM,CAAA;AAAA,CAAC;AAAA,CAAC;AAAC,QAAQ,EAAE,CAAC,CAAA;AAAA,CAAC;IAAA,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;AAAA,CAAC;AAAA;;;;;;;;;;;+BAW7E,CAAA;AAAA,GAAG,EAAC,CAAC,CAAA;AAAA,CAAC;IAAA,IAAI,CAAC,UAAU,CAAA;AAAA,CAAC;AAAC,CAAC,CAAA;AAAA,CAAC;IAAA,IAAI,CAAC,QAAQ,CAAA;AAAA,CAAC;AAAA;;;;;;;;;uBAS/C,CAAA;AAAA,SAAS,CAAA;AAAC,IAAI,EAAE,CAAC,CAAA;AAAA,CAAC;IAAA,IAAI,CAAC,QAAQ,CAAA;AAAA,CAAC;AAAC,IAAI,CAAA;AAAC,MAAM,CAAA;AAAC,CAAC,CAAA;AAAA,CAAC;IAAA,IAAI,CAAC,UAAU,CAAA;AAAA,CAAC;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0CAyG5C,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-harness.d.ts","sourceRoot":"","sources":["../../../../../src/packages/kbot/src/tools/memory-harness.ts"],"names":[],"mappings":""}