network-ai 3.0.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/QUICKSTART.md +260 -0
- package/README.md +604 -0
- package/SKILL.md +568 -0
- package/dist/adapters/adapter-registry.d.ts +94 -0
- package/dist/adapters/adapter-registry.d.ts.map +1 -0
- package/dist/adapters/adapter-registry.js +355 -0
- package/dist/adapters/adapter-registry.js.map +1 -0
- package/dist/adapters/agno-adapter.d.ts +112 -0
- package/dist/adapters/agno-adapter.d.ts.map +1 -0
- package/dist/adapters/agno-adapter.js +140 -0
- package/dist/adapters/agno-adapter.js.map +1 -0
- package/dist/adapters/autogen-adapter.d.ts +67 -0
- package/dist/adapters/autogen-adapter.d.ts.map +1 -0
- package/dist/adapters/autogen-adapter.js +141 -0
- package/dist/adapters/autogen-adapter.js.map +1 -0
- package/dist/adapters/base-adapter.d.ts +51 -0
- package/dist/adapters/base-adapter.d.ts.map +1 -0
- package/dist/adapters/base-adapter.js +103 -0
- package/dist/adapters/base-adapter.js.map +1 -0
- package/dist/adapters/crewai-adapter.d.ts +72 -0
- package/dist/adapters/crewai-adapter.d.ts.map +1 -0
- package/dist/adapters/crewai-adapter.js +148 -0
- package/dist/adapters/crewai-adapter.js.map +1 -0
- package/dist/adapters/custom-adapter.d.ts +74 -0
- package/dist/adapters/custom-adapter.d.ts.map +1 -0
- package/dist/adapters/custom-adapter.js +142 -0
- package/dist/adapters/custom-adapter.js.map +1 -0
- package/dist/adapters/dspy-adapter.d.ts +70 -0
- package/dist/adapters/dspy-adapter.d.ts.map +1 -0
- package/dist/adapters/dspy-adapter.js +127 -0
- package/dist/adapters/dspy-adapter.js.map +1 -0
- package/dist/adapters/haystack-adapter.d.ts +83 -0
- package/dist/adapters/haystack-adapter.d.ts.map +1 -0
- package/dist/adapters/haystack-adapter.js +149 -0
- package/dist/adapters/haystack-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +47 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +56 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/langchain-adapter.d.ts +51 -0
- package/dist/adapters/langchain-adapter.d.ts.map +1 -0
- package/dist/adapters/langchain-adapter.js +134 -0
- package/dist/adapters/langchain-adapter.js.map +1 -0
- package/dist/adapters/llamaindex-adapter.d.ts +89 -0
- package/dist/adapters/llamaindex-adapter.d.ts.map +1 -0
- package/dist/adapters/llamaindex-adapter.js +135 -0
- package/dist/adapters/llamaindex-adapter.js.map +1 -0
- package/dist/adapters/mcp-adapter.d.ts +90 -0
- package/dist/adapters/mcp-adapter.d.ts.map +1 -0
- package/dist/adapters/mcp-adapter.js +200 -0
- package/dist/adapters/mcp-adapter.js.map +1 -0
- package/dist/adapters/openai-assistants-adapter.d.ts +94 -0
- package/dist/adapters/openai-assistants-adapter.d.ts.map +1 -0
- package/dist/adapters/openai-assistants-adapter.js +130 -0
- package/dist/adapters/openai-assistants-adapter.js.map +1 -0
- package/dist/adapters/openclaw-adapter.d.ts +21 -0
- package/dist/adapters/openclaw-adapter.d.ts.map +1 -0
- package/dist/adapters/openclaw-adapter.js +140 -0
- package/dist/adapters/openclaw-adapter.js.map +1 -0
- package/dist/adapters/semantic-kernel-adapter.d.ts +73 -0
- package/dist/adapters/semantic-kernel-adapter.d.ts.map +1 -0
- package/dist/adapters/semantic-kernel-adapter.js +123 -0
- package/dist/adapters/semantic-kernel-adapter.js.map +1 -0
- package/dist/index.d.ts +379 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1428 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/blackboard-validator.d.ts +205 -0
- package/dist/lib/blackboard-validator.d.ts.map +1 -0
- package/dist/lib/blackboard-validator.js +756 -0
- package/dist/lib/blackboard-validator.js.map +1 -0
- package/dist/lib/locked-blackboard.d.ts +174 -0
- package/dist/lib/locked-blackboard.d.ts.map +1 -0
- package/dist/lib/locked-blackboard.js +654 -0
- package/dist/lib/locked-blackboard.js.map +1 -0
- package/dist/lib/swarm-utils.d.ts +136 -0
- package/dist/lib/swarm-utils.d.ts.map +1 -0
- package/dist/lib/swarm-utils.js +510 -0
- package/dist/lib/swarm-utils.js.map +1 -0
- package/dist/security.d.ts +269 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +713 -0
- package/dist/security.js.map +1 -0
- package/package.json +84 -0
- package/scripts/blackboard.py +819 -0
- package/scripts/check_permission.py +331 -0
- package/scripts/revoke_token.py +243 -0
- package/scripts/swarm_guard.py +1140 -0
- package/scripts/validate_token.py +97 -0
- package/types/agent-adapter.d.ts +244 -0
- package/types/openclaw-core.d.ts +52 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LlamaIndex Adapter
|
|
4
|
+
*
|
|
5
|
+
* Integrates LlamaIndex agents (QueryEngine, ChatEngine, AgentRunner)
|
|
6
|
+
* with the SwarmOrchestrator. LlamaIndex specialises in retrieval-augmented
|
|
7
|
+
* generation (RAG) and agent-based reasoning over data.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const adapter = new LlamaIndexAdapter();
|
|
11
|
+
* adapter.registerQueryEngine("rag-search", myQueryEngine);
|
|
12
|
+
* adapter.registerChatEngine("assistant", myChatEngine);
|
|
13
|
+
* adapter.registerAgentRunner("researcher", myAgentRunner);
|
|
14
|
+
* await registry.addAdapter(adapter);
|
|
15
|
+
*
|
|
16
|
+
* Then in the orchestrator:
|
|
17
|
+
* delegateTask({ targetAgent: "llamaindex:rag-search", ... })
|
|
18
|
+
*
|
|
19
|
+
* @module LlamaIndexAdapter
|
|
20
|
+
* @version 1.0.0
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.LlamaIndexAdapter = void 0;
|
|
24
|
+
const base_adapter_1 = require("./base-adapter");
|
|
25
|
+
class LlamaIndexAdapter extends base_adapter_1.BaseAdapter {
|
|
26
|
+
name = 'llamaindex';
|
|
27
|
+
version = '1.0.0';
|
|
28
|
+
engines = new Map();
|
|
29
|
+
get capabilities() {
|
|
30
|
+
return {
|
|
31
|
+
streaming: true,
|
|
32
|
+
parallel: true,
|
|
33
|
+
bidirectional: false,
|
|
34
|
+
discovery: true,
|
|
35
|
+
authentication: false,
|
|
36
|
+
statefulSessions: true,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
// --- Registration ---
|
|
40
|
+
registerQueryEngine(agentId, engine, metadata) {
|
|
41
|
+
this.engines.set(agentId, { type: 'query', engine });
|
|
42
|
+
this.registerLocalAgent({
|
|
43
|
+
id: agentId,
|
|
44
|
+
name: agentId,
|
|
45
|
+
description: metadata?.description ?? `LlamaIndex QueryEngine: ${agentId}`,
|
|
46
|
+
capabilities: metadata?.capabilities ?? ['query', 'rag'],
|
|
47
|
+
status: 'available',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
registerChatEngine(agentId, engine, metadata) {
|
|
51
|
+
this.engines.set(agentId, { type: 'chat', engine });
|
|
52
|
+
this.registerLocalAgent({
|
|
53
|
+
id: agentId,
|
|
54
|
+
name: agentId,
|
|
55
|
+
description: metadata?.description ?? `LlamaIndex ChatEngine: ${agentId}`,
|
|
56
|
+
capabilities: metadata?.capabilities ?? ['chat', 'rag'],
|
|
57
|
+
status: 'available',
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
registerAgentRunner(agentId, engine, metadata) {
|
|
61
|
+
this.engines.set(agentId, { type: 'agent', engine });
|
|
62
|
+
this.registerLocalAgent({
|
|
63
|
+
id: agentId,
|
|
64
|
+
name: agentId,
|
|
65
|
+
description: metadata?.description ?? `LlamaIndex AgentRunner: ${agentId}`,
|
|
66
|
+
capabilities: metadata?.capabilities ?? ['agent', 'reasoning', 'tools'],
|
|
67
|
+
status: 'available',
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
// --- Execution ---
|
|
71
|
+
async executeAgent(agentId, payload, context) {
|
|
72
|
+
this.ensureReady();
|
|
73
|
+
const entry = this.engines.get(agentId);
|
|
74
|
+
if (!entry) {
|
|
75
|
+
return this.errorResult('AGENT_NOT_FOUND', `LlamaIndex engine "${agentId}" is not registered`, false);
|
|
76
|
+
}
|
|
77
|
+
const query = this.extractQuery(payload);
|
|
78
|
+
const startTime = Date.now();
|
|
79
|
+
try {
|
|
80
|
+
switch (entry.type) {
|
|
81
|
+
case 'query':
|
|
82
|
+
return await this.executeQuery(entry.engine, query, startTime);
|
|
83
|
+
case 'chat':
|
|
84
|
+
return await this.executeChat(entry.engine, query, payload, startTime);
|
|
85
|
+
case 'agent':
|
|
86
|
+
return await this.executeAgentRunner(entry.engine, query, startTime);
|
|
87
|
+
default:
|
|
88
|
+
return this.errorResult('UNKNOWN_TYPE', 'Unknown engine type', false);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return this.errorResult('LLAMAINDEX_ERROR', error instanceof Error ? error.message : 'LlamaIndex execution failed', true, error);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// --- Private helpers ---
|
|
96
|
+
extractQuery(payload) {
|
|
97
|
+
if (payload.handoff?.instruction)
|
|
98
|
+
return payload.handoff.instruction;
|
|
99
|
+
if (payload.params?.query)
|
|
100
|
+
return String(payload.params.query);
|
|
101
|
+
if (payload.params?.message)
|
|
102
|
+
return String(payload.params.message);
|
|
103
|
+
return JSON.stringify(payload.params);
|
|
104
|
+
}
|
|
105
|
+
async executeQuery(engine, query, startTime) {
|
|
106
|
+
const response = await engine.query(query);
|
|
107
|
+
return this.successResult(this.normalizeResponse(response), Date.now() - startTime);
|
|
108
|
+
}
|
|
109
|
+
async executeChat(engine, message, payload, startTime) {
|
|
110
|
+
const history = payload.params?.chatHistory;
|
|
111
|
+
const response = await engine.chat(message, history);
|
|
112
|
+
return this.successResult(this.normalizeResponse(response), Date.now() - startTime);
|
|
113
|
+
}
|
|
114
|
+
async executeAgentRunner(engine, message, startTime) {
|
|
115
|
+
const response = await engine.chat(message);
|
|
116
|
+
return this.successResult(this.normalizeResponse(response), Date.now() - startTime);
|
|
117
|
+
}
|
|
118
|
+
normalizeResponse(response) {
|
|
119
|
+
const text = response.response ?? response.toString?.() ?? '';
|
|
120
|
+
const result = { response: text };
|
|
121
|
+
if (response.sourceNodes?.length) {
|
|
122
|
+
result.sources = response.sourceNodes.map((sn) => ({
|
|
123
|
+
text: sn.node?.text?.slice(0, 200),
|
|
124
|
+
score: sn.score,
|
|
125
|
+
metadata: sn.node?.metadata,
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
128
|
+
if (response.metadata) {
|
|
129
|
+
result.metadata = response.metadata;
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
exports.LlamaIndexAdapter = LlamaIndexAdapter;
|
|
135
|
+
//# sourceMappingURL=llamaindex-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llamaindex-adapter.js","sourceRoot":"","sources":["../../adapters/llamaindex-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP (Model Context Protocol) Adapter
|
|
3
|
+
*
|
|
4
|
+
* Connects the SwarmOrchestrator to MCP servers, enabling agent communication
|
|
5
|
+
* over the Model Context Protocol. This enables cross-network agent discovery
|
|
6
|
+
* and execution via MCP's tool-calling interface.
|
|
7
|
+
*
|
|
8
|
+
* MCP servers expose "tools" -- this adapter maps each tool to an agent
|
|
9
|
+
* that the orchestrator can delegate tasks to.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* const adapter = new MCPAdapter();
|
|
13
|
+
* await registry.addAdapter(adapter, {
|
|
14
|
+
* connection: { url: 'http://localhost:3000/mcp' }
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* Or with pre-registered tool functions:
|
|
18
|
+
* const adapter = new MCPAdapter();
|
|
19
|
+
* adapter.registerTool("search", searchFunction);
|
|
20
|
+
* await registry.addAdapter(adapter);
|
|
21
|
+
*
|
|
22
|
+
* Then in the orchestrator:
|
|
23
|
+
* delegateTask({ targetAgent: "mcp:search", ... })
|
|
24
|
+
*
|
|
25
|
+
* @module MCPAdapter
|
|
26
|
+
* @version 1.0.0
|
|
27
|
+
*/
|
|
28
|
+
import { BaseAdapter } from './base-adapter';
|
|
29
|
+
import type { AdapterConfig, AdapterCapabilities, AgentPayload, AgentContext, AgentResult } from '../types/agent-adapter';
|
|
30
|
+
/**
|
|
31
|
+
* MCP Tool definition (matches MCP spec)
|
|
32
|
+
*/
|
|
33
|
+
export interface MCPTool {
|
|
34
|
+
name: string;
|
|
35
|
+
description?: string;
|
|
36
|
+
inputSchema?: Record<string, unknown>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* MCP tool execution function
|
|
40
|
+
*/
|
|
41
|
+
export type MCPToolHandler = (args: Record<string, unknown>) => Promise<{
|
|
42
|
+
content: Array<{
|
|
43
|
+
type: string;
|
|
44
|
+
text?: string;
|
|
45
|
+
data?: unknown;
|
|
46
|
+
}>;
|
|
47
|
+
isError?: boolean;
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* MCP Server connection interface
|
|
51
|
+
*/
|
|
52
|
+
export interface MCPServerConnection {
|
|
53
|
+
/** List available tools from the MCP server */
|
|
54
|
+
listTools(): Promise<MCPTool[]>;
|
|
55
|
+
/** Call a tool on the MCP server */
|
|
56
|
+
callTool(name: string, args: Record<string, unknown>): Promise<{
|
|
57
|
+
content: Array<{
|
|
58
|
+
type: string;
|
|
59
|
+
text?: string;
|
|
60
|
+
data?: unknown;
|
|
61
|
+
}>;
|
|
62
|
+
isError?: boolean;
|
|
63
|
+
}>;
|
|
64
|
+
/** Close the connection */
|
|
65
|
+
close(): Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
export declare class MCPAdapter extends BaseAdapter {
|
|
68
|
+
readonly name = "mcp";
|
|
69
|
+
readonly version = "1.0.0";
|
|
70
|
+
private tools;
|
|
71
|
+
private toolMetadata;
|
|
72
|
+
private serverConnection;
|
|
73
|
+
get capabilities(): AdapterCapabilities;
|
|
74
|
+
initialize(config: AdapterConfig): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Register a local tool handler (no MCP server needed)
|
|
77
|
+
*/
|
|
78
|
+
registerTool(name: string, handler: MCPToolHandler, metadata?: {
|
|
79
|
+
description?: string;
|
|
80
|
+
inputSchema?: Record<string, unknown>;
|
|
81
|
+
}): void;
|
|
82
|
+
private discoverServerTools;
|
|
83
|
+
executeAgent(agentId: string, payload: AgentPayload, context: AgentContext): Promise<AgentResult>;
|
|
84
|
+
private executeLocalTool;
|
|
85
|
+
private executeRemoteTool;
|
|
86
|
+
private buildToolArgs;
|
|
87
|
+
private extractContent;
|
|
88
|
+
shutdown(): Promise<void>;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=mcp-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-adapter.d.ts","sourceRoot":"","sources":["../../adapters/mcp-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAEhC;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAErG;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAChC,oCAAoC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAC7D,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QAChE,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;IACH,2BAA2B;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,qBAAa,UAAW,SAAQ,WAAW;IACzC,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,OAAO,WAAW;IAC3B,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,gBAAgB,CAAoC;IAE5D,IAAI,YAAY,IAAI,mBAAmB,CAStC;IAEK,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBtD;;OAEG;IACH,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,cAAc,EACvB,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GACzE,IAAI;YAgBO,mBAAmB;IAqB3B,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,WAAW,CAAC;YAuBT,gBAAgB;YA+BhB,iBAAiB;IAiC/B,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,cAAc;IAoBhB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAWhC"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP (Model Context Protocol) Adapter
|
|
4
|
+
*
|
|
5
|
+
* Connects the SwarmOrchestrator to MCP servers, enabling agent communication
|
|
6
|
+
* over the Model Context Protocol. This enables cross-network agent discovery
|
|
7
|
+
* and execution via MCP's tool-calling interface.
|
|
8
|
+
*
|
|
9
|
+
* MCP servers expose "tools" -- this adapter maps each tool to an agent
|
|
10
|
+
* that the orchestrator can delegate tasks to.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* const adapter = new MCPAdapter();
|
|
14
|
+
* await registry.addAdapter(adapter, {
|
|
15
|
+
* connection: { url: 'http://localhost:3000/mcp' }
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* Or with pre-registered tool functions:
|
|
19
|
+
* const adapter = new MCPAdapter();
|
|
20
|
+
* adapter.registerTool("search", searchFunction);
|
|
21
|
+
* await registry.addAdapter(adapter);
|
|
22
|
+
*
|
|
23
|
+
* Then in the orchestrator:
|
|
24
|
+
* delegateTask({ targetAgent: "mcp:search", ... })
|
|
25
|
+
*
|
|
26
|
+
* @module MCPAdapter
|
|
27
|
+
* @version 1.0.0
|
|
28
|
+
*/
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.MCPAdapter = void 0;
|
|
31
|
+
const base_adapter_1 = require("./base-adapter");
|
|
32
|
+
class MCPAdapter extends base_adapter_1.BaseAdapter {
|
|
33
|
+
name = 'mcp';
|
|
34
|
+
version = '1.0.0';
|
|
35
|
+
tools = new Map();
|
|
36
|
+
toolMetadata = new Map();
|
|
37
|
+
serverConnection = null;
|
|
38
|
+
get capabilities() {
|
|
39
|
+
return {
|
|
40
|
+
streaming: true,
|
|
41
|
+
parallel: true,
|
|
42
|
+
bidirectional: false,
|
|
43
|
+
discovery: true,
|
|
44
|
+
authentication: true,
|
|
45
|
+
statefulSessions: false,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async initialize(config) {
|
|
49
|
+
await super.initialize(config);
|
|
50
|
+
// If a server connection factory is provided, use it
|
|
51
|
+
if (config.options?.serverConnection) {
|
|
52
|
+
this.serverConnection = config.options.serverConnection;
|
|
53
|
+
// Discover tools from the server
|
|
54
|
+
await this.discoverServerTools();
|
|
55
|
+
}
|
|
56
|
+
// If a URL is provided, the user needs to set up the connection themselves
|
|
57
|
+
// (We don't bundle an MCP client library -- keep it dependency-free)
|
|
58
|
+
if (config.connection?.url && !this.serverConnection) {
|
|
59
|
+
console.info(`[MCPAdapter] URL configured: ${config.connection.url}. ` +
|
|
60
|
+
`Provide a serverConnection via config.options.serverConnection or register tools manually.`);
|
|
61
|
+
}
|
|
62
|
+
this.ready = true;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Register a local tool handler (no MCP server needed)
|
|
66
|
+
*/
|
|
67
|
+
registerTool(name, handler, metadata) {
|
|
68
|
+
this.tools.set(name, handler);
|
|
69
|
+
this.toolMetadata.set(name, {
|
|
70
|
+
name,
|
|
71
|
+
description: metadata?.description,
|
|
72
|
+
inputSchema: metadata?.inputSchema,
|
|
73
|
+
});
|
|
74
|
+
this.registerLocalAgent({
|
|
75
|
+
id: name,
|
|
76
|
+
name,
|
|
77
|
+
description: metadata?.description ?? `MCP tool: ${name}`,
|
|
78
|
+
capabilities: ['tool'],
|
|
79
|
+
status: 'available',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async discoverServerTools() {
|
|
83
|
+
if (!this.serverConnection)
|
|
84
|
+
return;
|
|
85
|
+
try {
|
|
86
|
+
const tools = await this.serverConnection.listTools();
|
|
87
|
+
for (const tool of tools) {
|
|
88
|
+
this.toolMetadata.set(tool.name, tool);
|
|
89
|
+
this.registerLocalAgent({
|
|
90
|
+
id: tool.name,
|
|
91
|
+
name: tool.name,
|
|
92
|
+
description: tool.description ?? `MCP server tool: ${tool.name}`,
|
|
93
|
+
capabilities: ['tool'],
|
|
94
|
+
status: 'available',
|
|
95
|
+
metadata: { inputSchema: tool.inputSchema },
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error('[MCPAdapter] Failed to discover server tools:', error);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async executeAgent(agentId, payload, context) {
|
|
104
|
+
this.ensureReady();
|
|
105
|
+
const startTime = Date.now();
|
|
106
|
+
// Strategy 1: Local tool handler
|
|
107
|
+
const localHandler = this.tools.get(agentId);
|
|
108
|
+
if (localHandler) {
|
|
109
|
+
return this.executeLocalTool(agentId, localHandler, payload, startTime);
|
|
110
|
+
}
|
|
111
|
+
// Strategy 2: Remote MCP server
|
|
112
|
+
if (this.serverConnection) {
|
|
113
|
+
return this.executeRemoteTool(agentId, payload, startTime);
|
|
114
|
+
}
|
|
115
|
+
return this.errorResult('TOOL_NOT_FOUND', `MCP tool "${agentId}" not found locally or on any connected server`, false);
|
|
116
|
+
}
|
|
117
|
+
async executeLocalTool(name, handler, payload, startTime) {
|
|
118
|
+
try {
|
|
119
|
+
const args = this.buildToolArgs(payload);
|
|
120
|
+
const result = await handler(args);
|
|
121
|
+
if (result.isError) {
|
|
122
|
+
const errorText = result.content
|
|
123
|
+
.filter(c => c.type === 'text')
|
|
124
|
+
.map(c => c.text)
|
|
125
|
+
.join('\n');
|
|
126
|
+
return this.errorResult('TOOL_ERROR', errorText || 'Tool returned an error', true);
|
|
127
|
+
}
|
|
128
|
+
// Extract text content from MCP response format
|
|
129
|
+
const data = this.extractContent(result.content);
|
|
130
|
+
return this.successResult(data, Date.now() - startTime);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
return this.errorResult('MCP_ERROR', error instanceof Error ? error.message : 'MCP tool execution failed', true, error);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async executeRemoteTool(name, payload, startTime) {
|
|
137
|
+
if (!this.serverConnection) {
|
|
138
|
+
return this.errorResult('NO_CONNECTION', 'No MCP server connection', false);
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
const args = this.buildToolArgs(payload);
|
|
142
|
+
const result = await this.serverConnection.callTool(name, args);
|
|
143
|
+
if (result.isError) {
|
|
144
|
+
const errorText = result.content
|
|
145
|
+
.filter(c => c.type === 'text')
|
|
146
|
+
.map(c => c.text)
|
|
147
|
+
.join('\n');
|
|
148
|
+
return this.errorResult('TOOL_ERROR', errorText || 'Remote tool returned an error', true);
|
|
149
|
+
}
|
|
150
|
+
const data = this.extractContent(result.content);
|
|
151
|
+
return this.successResult(data, Date.now() - startTime);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
return this.errorResult('MCP_REMOTE_ERROR', error instanceof Error ? error.message : 'Remote MCP tool call failed', true, error);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
buildToolArgs(payload) {
|
|
158
|
+
const args = { ...payload.params };
|
|
159
|
+
if (payload.handoff) {
|
|
160
|
+
args.instruction = payload.handoff.instruction;
|
|
161
|
+
if (payload.handoff.context) {
|
|
162
|
+
args.context = payload.handoff.context;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return args;
|
|
166
|
+
}
|
|
167
|
+
extractContent(content) {
|
|
168
|
+
if (content.length === 1) {
|
|
169
|
+
if (content[0].type === 'text' && content[0].text) {
|
|
170
|
+
// Try to parse as JSON
|
|
171
|
+
try {
|
|
172
|
+
return JSON.parse(content[0].text);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return content[0].text;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return content[0].data ?? content[0].text;
|
|
179
|
+
}
|
|
180
|
+
// Multiple content blocks -- return structured
|
|
181
|
+
return content.map(c => ({
|
|
182
|
+
type: c.type,
|
|
183
|
+
value: c.type === 'text' ? c.text : c.data,
|
|
184
|
+
}));
|
|
185
|
+
}
|
|
186
|
+
async shutdown() {
|
|
187
|
+
if (this.serverConnection) {
|
|
188
|
+
try {
|
|
189
|
+
await this.serverConnection.close();
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// Best-effort
|
|
193
|
+
}
|
|
194
|
+
this.serverConnection = null;
|
|
195
|
+
}
|
|
196
|
+
await super.shutdown();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
exports.MCPAdapter = MCPAdapter;
|
|
200
|
+
//# sourceMappingURL=mcp-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-adapter.js","sourceRoot":"","sources":["../../adapters/mcp-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Assistants Adapter
|
|
3
|
+
*
|
|
4
|
+
* Integrates OpenAI's Assistants API (v2) with the SwarmOrchestrator.
|
|
5
|
+
* Supports function calling, code interpreter, file search, and
|
|
6
|
+
* custom assistant configurations.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const adapter = new OpenAIAssistantsAdapter();
|
|
10
|
+
* adapter.registerAssistant("analyst", { assistantId: "asst_abc123", apiKey });
|
|
11
|
+
* adapter.registerLocalFunction("calculator", async (params) => calculate(params));
|
|
12
|
+
* await registry.addAdapter(adapter);
|
|
13
|
+
*
|
|
14
|
+
* Then in the orchestrator:
|
|
15
|
+
* delegateTask({ targetAgent: "openai-assistants:analyst", ... })
|
|
16
|
+
*
|
|
17
|
+
* @module OpenAIAssistantsAdapter
|
|
18
|
+
* @version 1.0.0
|
|
19
|
+
*/
|
|
20
|
+
import { BaseAdapter } from './base-adapter';
|
|
21
|
+
import type { AdapterConfig, AdapterCapabilities, AgentPayload, AgentContext, AgentResult } from '../types/agent-adapter';
|
|
22
|
+
/** Configuration for an OpenAI Assistant */
|
|
23
|
+
export interface AssistantConfig {
|
|
24
|
+
/** The assistant ID from OpenAI (asst_xxx) */
|
|
25
|
+
assistantId: string;
|
|
26
|
+
/** OpenAI API key -- or set via adapter config */
|
|
27
|
+
apiKey?: string;
|
|
28
|
+
/** Model override (defaults to the assistant's configured model) */
|
|
29
|
+
model?: string;
|
|
30
|
+
/** Max tokens for responses */
|
|
31
|
+
maxTokens?: number;
|
|
32
|
+
/** Custom headers */
|
|
33
|
+
headers?: Record<string, string>;
|
|
34
|
+
/** Base URL override (for Azure OpenAI or proxies) */
|
|
35
|
+
baseUrl?: string;
|
|
36
|
+
}
|
|
37
|
+
/** Thread message */
|
|
38
|
+
export interface ThreadMessage {
|
|
39
|
+
role: 'user' | 'assistant';
|
|
40
|
+
content: string;
|
|
41
|
+
metadata?: Record<string, string>;
|
|
42
|
+
}
|
|
43
|
+
/** Run result */
|
|
44
|
+
export interface RunResult {
|
|
45
|
+
status: 'completed' | 'failed' | 'requires_action' | 'cancelled' | 'expired';
|
|
46
|
+
messages: ThreadMessage[];
|
|
47
|
+
usage?: {
|
|
48
|
+
prompt_tokens: number;
|
|
49
|
+
completion_tokens: number;
|
|
50
|
+
total_tokens: number;
|
|
51
|
+
};
|
|
52
|
+
error?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Client interface for OpenAI Assistants API.
|
|
56
|
+
* Users provide their own client (e.g. the openai npm package) to avoid
|
|
57
|
+
* making the adapter depend on any external package.
|
|
58
|
+
*/
|
|
59
|
+
export interface OpenAIAssistantsClient {
|
|
60
|
+
/** Create a thread */
|
|
61
|
+
createThread?(): Promise<{
|
|
62
|
+
id: string;
|
|
63
|
+
}>;
|
|
64
|
+
/** Add a message to a thread */
|
|
65
|
+
addMessage?(threadId: string, message: ThreadMessage): Promise<void>;
|
|
66
|
+
/** Create and poll a run */
|
|
67
|
+
createAndPollRun?(threadId: string, assistantId: string, options?: {
|
|
68
|
+
model?: string;
|
|
69
|
+
maxTokens?: number;
|
|
70
|
+
}): Promise<RunResult>;
|
|
71
|
+
/**
|
|
72
|
+
* Simple single-shot helper: send a message, get a response.
|
|
73
|
+
* If provided, the adapter prefers this over the thread-based flow.
|
|
74
|
+
*/
|
|
75
|
+
chat?(assistantId: string, message: string, options?: Record<string, unknown>): Promise<{
|
|
76
|
+
response: string;
|
|
77
|
+
usage?: Record<string, number>;
|
|
78
|
+
}>;
|
|
79
|
+
}
|
|
80
|
+
export declare class OpenAIAssistantsAdapter extends BaseAdapter {
|
|
81
|
+
readonly name = "openai-assistants";
|
|
82
|
+
readonly version = "1.0.0";
|
|
83
|
+
private assistants;
|
|
84
|
+
private defaultClient?;
|
|
85
|
+
get capabilities(): AdapterCapabilities;
|
|
86
|
+
initialize(config: AdapterConfig): Promise<void>;
|
|
87
|
+
registerAssistant(agentId: string, assistantConfig: AssistantConfig, client?: OpenAIAssistantsClient, metadata?: {
|
|
88
|
+
description?: string;
|
|
89
|
+
capabilities?: string[];
|
|
90
|
+
}): void;
|
|
91
|
+
executeAgent(agentId: string, payload: AgentPayload, context: AgentContext): Promise<AgentResult>;
|
|
92
|
+
private buildMessage;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=openai-assistants-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-assistants-adapter.d.ts","sourceRoot":"","sources":["../../adapters/openai-assistants-adapter.ts"],"names":[],"mappings":"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"}
|