@contractspec/lib.ai-agent 1.57.0 → 1.59.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/agent/agent-factory.d.ts +67 -71
- package/dist/agent/agent-factory.d.ts.map +1 -1
- package/dist/agent/agent-factory.js +658 -100
- package/dist/agent/agent.test.d.ts +2 -0
- package/dist/agent/agent.test.d.ts.map +1 -0
- package/dist/agent/contract-spec-agent.d.ts +48 -52
- package/dist/agent/contract-spec-agent.d.ts.map +1 -1
- package/dist/agent/contract-spec-agent.js +605 -146
- package/dist/agent/index.d.ts +4 -4
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +2102 -4
- package/dist/agent/json-runner.d.ts +15 -19
- package/dist/agent/json-runner.d.ts.map +1 -1
- package/dist/agent/json-runner.js +672 -57
- package/dist/agent/json-runner.test.d.ts +2 -0
- package/dist/agent/json-runner.test.d.ts.map +1 -0
- package/dist/agent/unified-agent.d.ts +132 -109
- package/dist/agent/unified-agent.d.ts.map +1 -1
- package/dist/agent/unified-agent.js +2011 -293
- package/dist/approval/index.d.ts +3 -2
- package/dist/approval/index.d.ts.map +1 -0
- package/dist/approval/index.js +128 -2
- package/dist/approval/workflow.d.ts +106 -110
- package/dist/approval/workflow.d.ts.map +1 -1
- package/dist/approval/workflow.js +126 -157
- package/dist/exporters/claude-agent-exporter.d.ts +50 -48
- package/dist/exporters/claude-agent-exporter.d.ts.map +1 -1
- package/dist/exporters/claude-agent-exporter.js +258 -203
- package/dist/exporters/index.d.ts +28 -4
- package/dist/exporters/index.d.ts.map +1 -0
- package/dist/exporters/index.js +737 -3
- package/dist/exporters/opencode-exporter.d.ts +47 -45
- package/dist/exporters/opencode-exporter.d.ts.map +1 -1
- package/dist/exporters/opencode-exporter.js +507 -191
- package/dist/exporters/types.d.ts +171 -169
- package/dist/exporters/types.d.ts.map +1 -1
- package/dist/exporters/types.js +1 -0
- package/dist/index.d.ts +15 -39
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3337 -32
- package/dist/interop/index.d.ts +48 -4
- package/dist/interop/index.d.ts.map +1 -0
- package/dist/interop/index.js +709 -3
- package/dist/interop/spec-consumer.d.ts +57 -53
- package/dist/interop/spec-consumer.d.ts.map +1 -1
- package/dist/interop/spec-consumer.js +302 -282
- package/dist/interop/tool-consumer.d.ts +57 -53
- package/dist/interop/tool-consumer.d.ts.map +1 -1
- package/dist/interop/tool-consumer.js +412 -213
- package/dist/interop/types.d.ts +173 -171
- package/dist/interop/types.d.ts.map +1 -1
- package/dist/interop/types.js +1 -0
- package/dist/knowledge/index.d.ts +2 -2
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +66 -2
- package/dist/knowledge/injector.d.ts +16 -20
- package/dist/knowledge/injector.d.ts.map +1 -1
- package/dist/knowledge/injector.js +56 -47
- package/dist/memory/in-memory.d.ts +15 -19
- package/dist/memory/in-memory.d.ts.map +1 -1
- package/dist/memory/in-memory.js +152 -46
- package/dist/memory/index.d.ts +3 -3
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +155 -3
- package/dist/memory/manager.d.ts +32 -36
- package/dist/memory/manager.d.ts.map +1 -1
- package/dist/memory/manager.js +96 -70
- package/dist/memory/memory.test.d.ts +2 -0
- package/dist/memory/memory.test.d.ts.map +1 -0
- package/dist/node/agent/agent-factory.js +661 -0
- package/dist/node/agent/contract-spec-agent.js +607 -0
- package/dist/node/agent/index.js +2103 -0
- package/dist/node/agent/json-runner.js +684 -0
- package/dist/node/agent/unified-agent.js +2019 -0
- package/dist/node/approval/index.js +129 -0
- package/dist/node/approval/workflow.js +129 -0
- package/dist/node/exporters/claude-agent-exporter.js +265 -0
- package/dist/node/exporters/index.js +738 -0
- package/dist/node/exporters/opencode-exporter.js +516 -0
- package/dist/node/exporters/types.js +0 -0
- package/dist/node/index.js +3337 -0
- package/dist/node/interop/index.js +710 -0
- package/dist/node/interop/spec-consumer.js +307 -0
- package/dist/node/interop/tool-consumer.js +419 -0
- package/dist/node/interop/types.js +0 -0
- package/dist/node/knowledge/index.js +67 -0
- package/dist/node/knowledge/injector.js +67 -0
- package/dist/node/memory/in-memory.js +154 -0
- package/dist/node/memory/index.js +156 -0
- package/dist/node/memory/manager.js +105 -0
- package/dist/node/providers/claude-agent-sdk/adapter.js +624 -0
- package/dist/node/providers/claude-agent-sdk/index.js +673 -0
- package/dist/node/providers/claude-agent-sdk/session-bridge.js +149 -0
- package/dist/node/providers/claude-agent-sdk/tool-bridge.js +118 -0
- package/dist/node/providers/index.js +1261 -0
- package/dist/node/providers/opencode-sdk/adapter.js +669 -0
- package/dist/node/providers/opencode-sdk/agent-bridge.js +299 -0
- package/dist/node/providers/opencode-sdk/index.js +703 -0
- package/dist/node/providers/opencode-sdk/tool-bridge.js +141 -0
- package/dist/node/providers/registry.js +89 -0
- package/dist/node/providers/types.js +56 -0
- package/dist/node/schema/index.js +195 -0
- package/dist/node/schema/json-schema-to-zod.js +152 -0
- package/dist/node/schema/schema-output.js +190 -0
- package/dist/node/session/index.js +90 -0
- package/dist/node/session/store.js +90 -0
- package/dist/node/spec/index.js +85 -0
- package/dist/node/spec/registry.js +56 -0
- package/dist/node/spec/spec.js +44 -0
- package/dist/node/telemetry/adapter.js +85 -0
- package/dist/node/telemetry/index.js +86 -0
- package/dist/node/tools/index.js +345 -0
- package/dist/node/tools/knowledge-tool.js +74 -0
- package/dist/node/tools/mcp-client.js +47 -0
- package/dist/node/tools/mcp-server.js +205 -0
- package/dist/node/tools/tool-adapter.js +197 -0
- package/dist/node/types.js +0 -0
- package/dist/providers/claude-agent-sdk/adapter.d.ts +60 -52
- package/dist/providers/claude-agent-sdk/adapter.d.ts.map +1 -1
- package/dist/providers/claude-agent-sdk/adapter.js +622 -304
- package/dist/providers/claude-agent-sdk/index.d.ts +22 -4
- package/dist/providers/claude-agent-sdk/index.d.ts.map +1 -0
- package/dist/providers/claude-agent-sdk/index.js +672 -4
- package/dist/providers/claude-agent-sdk/session-bridge.d.ts +43 -40
- package/dist/providers/claude-agent-sdk/session-bridge.d.ts.map +1 -1
- package/dist/providers/claude-agent-sdk/session-bridge.js +121 -130
- package/dist/providers/claude-agent-sdk/tool-bridge.d.ts +63 -60
- package/dist/providers/claude-agent-sdk/tool-bridge.d.ts.map +1 -1
- package/dist/providers/claude-agent-sdk/tool-bridge.js +104 -108
- package/dist/providers/index.d.ts +28 -7
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +1261 -8
- package/dist/providers/opencode-sdk/adapter.d.ts +56 -48
- package/dist/providers/opencode-sdk/adapter.d.ts.map +1 -1
- package/dist/providers/opencode-sdk/adapter.js +667 -274
- package/dist/providers/opencode-sdk/agent-bridge.d.ts +62 -57
- package/dist/providers/opencode-sdk/agent-bridge.d.ts.map +1 -1
- package/dist/providers/opencode-sdk/agent-bridge.js +289 -155
- package/dist/providers/opencode-sdk/index.d.ts +22 -4
- package/dist/providers/opencode-sdk/index.d.ts.map +1 -0
- package/dist/providers/opencode-sdk/index.js +702 -4
- package/dist/providers/opencode-sdk/tool-bridge.d.ts +41 -42
- package/dist/providers/opencode-sdk/tool-bridge.d.ts.map +1 -1
- package/dist/providers/opencode-sdk/tool-bridge.js +121 -107
- package/dist/providers/registry.d.ts +10 -11
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +86 -49
- package/dist/providers/types.d.ts +169 -166
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +54 -42
- package/dist/schema/index.d.ts +3 -3
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +194 -3
- package/dist/schema/json-schema-to-zod.d.ts +23 -26
- package/dist/schema/json-schema-to-zod.d.ts.map +1 -1
- package/dist/schema/json-schema-to-zod.js +138 -110
- package/dist/schema/schema-output.d.ts +29 -32
- package/dist/schema/schema-output.d.ts.map +1 -1
- package/dist/schema/schema-output.js +178 -53
- package/dist/session/index.d.ts +2 -2
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +89 -2
- package/dist/session/store.d.ts +51 -55
- package/dist/session/store.d.ts.map +1 -1
- package/dist/session/store.js +85 -74
- package/dist/spec/index.d.ts +3 -3
- package/dist/spec/index.d.ts.map +1 -0
- package/dist/spec/index.js +84 -3
- package/dist/spec/registry.d.ts +32 -36
- package/dist/spec/registry.d.ts.map +1 -1
- package/dist/spec/registry.js +51 -60
- package/dist/spec/spec.d.ts +80 -84
- package/dist/spec/spec.d.ts.map +1 -1
- package/dist/spec/spec.js +40 -26
- package/dist/telemetry/adapter.d.ts +33 -37
- package/dist/telemetry/adapter.d.ts.map +1 -1
- package/dist/telemetry/adapter.js +78 -96
- package/dist/telemetry/index.d.ts +2 -2
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +85 -2
- package/dist/tools/index.d.ts +5 -5
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +344 -5
- package/dist/tools/knowledge-tool.d.ts +4 -8
- package/dist/tools/knowledge-tool.d.ts.map +1 -1
- package/dist/tools/knowledge-tool.js +68 -48
- package/dist/tools/mcp-client.d.ts +17 -21
- package/dist/tools/mcp-client.d.ts.map +1 -1
- package/dist/tools/mcp-client.js +42 -53
- package/dist/tools/mcp-server.d.ts +14 -18
- package/dist/tools/mcp-server.d.ts.map +1 -1
- package/dist/tools/mcp-server.js +200 -64
- package/dist/tools/tool-adapter.d.ts +7 -11
- package/dist/tools/tool-adapter.d.ts.map +1 -1
- package/dist/tools/tool-adapter.js +187 -70
- package/dist/tools/tools.test.d.ts +2 -0
- package/dist/tools/tools.test.d.ts.map +1 -0
- package/dist/types.d.ts +108 -111
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/package.json +448 -90
- package/dist/_virtual/_rolldown/runtime.js +0 -8
- package/dist/agent/agent-factory.js.map +0 -1
- package/dist/agent/contract-spec-agent.js.map +0 -1
- package/dist/agent/json-runner.js.map +0 -1
- package/dist/agent/unified-agent.js.map +0 -1
- package/dist/approval/workflow.js.map +0 -1
- package/dist/exporters/claude-agent-exporter.js.map +0 -1
- package/dist/exporters/opencode-exporter.js.map +0 -1
- package/dist/interop/spec-consumer.js.map +0 -1
- package/dist/interop/tool-consumer.js.map +0 -1
- package/dist/knowledge/injector.js.map +0 -1
- package/dist/memory/in-memory.js.map +0 -1
- package/dist/memory/manager.js.map +0 -1
- package/dist/providers/claude-agent-sdk/adapter.js.map +0 -1
- package/dist/providers/claude-agent-sdk/session-bridge.js.map +0 -1
- package/dist/providers/claude-agent-sdk/tool-bridge.js.map +0 -1
- package/dist/providers/opencode-sdk/adapter.js.map +0 -1
- package/dist/providers/opencode-sdk/agent-bridge.js.map +0 -1
- package/dist/providers/opencode-sdk/tool-bridge.js.map +0 -1
- package/dist/providers/registry.js.map +0 -1
- package/dist/providers/types.js.map +0 -1
- package/dist/schema/json-schema-to-zod.js.map +0 -1
- package/dist/schema/schema-output.js.map +0 -1
- package/dist/session/store.js.map +0 -1
- package/dist/spec/registry.js.map +0 -1
- package/dist/spec/spec.js.map +0 -1
- package/dist/telemetry/adapter.js.map +0 -1
- package/dist/tools/knowledge-tool.js.map +0 -1
- package/dist/tools/mcp-client.js.map +0 -1
- package/dist/tools/mcp-server.js.map +0 -1
- package/dist/tools/tool-adapter.js.map +0 -1
|
@@ -1,220 +1,419 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
version;
|
|
12
|
-
running = false;
|
|
13
|
-
constructor(config) {
|
|
14
|
-
this.tools = /* @__PURE__ */ new Map();
|
|
15
|
-
this.name = config.name ?? "contractspec-tools";
|
|
16
|
-
this.version = config.version ?? "1.0.0";
|
|
17
|
-
for (const tool of config.tools) this.tools.set(tool.config.name, tool);
|
|
18
|
-
}
|
|
19
|
-
async start() {
|
|
20
|
-
if (this.running) return;
|
|
21
|
-
this.running = true;
|
|
22
|
-
console.log(`[MCPToolServer] Started ${this.name}@${this.version} with ${this.tools.size} tools`);
|
|
23
|
-
}
|
|
24
|
-
async stop() {
|
|
25
|
-
if (!this.running) return;
|
|
26
|
-
this.running = false;
|
|
27
|
-
console.log(`[MCPToolServer] Stopped ${this.name}`);
|
|
28
|
-
}
|
|
29
|
-
isRunning() {
|
|
30
|
-
return this.running;
|
|
31
|
-
}
|
|
32
|
-
getTools() {
|
|
33
|
-
return Array.from(this.tools.values()).map((t) => t.config);
|
|
34
|
-
}
|
|
35
|
-
async executeTool(toolName, args, context) {
|
|
36
|
-
const tool = this.tools.get(toolName);
|
|
37
|
-
if (!tool) throw new Error(`Tool not found: ${toolName}`);
|
|
38
|
-
if (!tool.handler) throw new Error(`No handler registered for tool: ${toolName}`);
|
|
39
|
-
const fullContext = {
|
|
40
|
-
agentId: context?.agentId ?? "mcp-server",
|
|
41
|
-
sessionId: context?.sessionId ?? "mcp-session",
|
|
42
|
-
tenantId: context?.tenantId,
|
|
43
|
-
actorId: context?.actorId,
|
|
44
|
-
metadata: context?.metadata,
|
|
45
|
-
signal: context?.signal
|
|
46
|
-
};
|
|
47
|
-
return await tool.handler(args, fullContext);
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Get MCP-compatible tool definitions.
|
|
51
|
-
*/
|
|
52
|
-
getMCPToolDefinitions() {
|
|
53
|
-
const definitions = [];
|
|
54
|
-
for (const [name, tool] of this.tools) definitions.push({
|
|
55
|
-
name,
|
|
56
|
-
description: tool.config.description ?? "",
|
|
57
|
-
inputSchema: tool.config.schema ?? {
|
|
58
|
-
type: "object",
|
|
59
|
-
properties: {}
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
return definitions;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Get server info for MCP.
|
|
66
|
-
*/
|
|
67
|
-
getServerInfo() {
|
|
68
|
-
return {
|
|
69
|
-
name: this.name,
|
|
70
|
-
version: this.version,
|
|
71
|
-
tools: this.tools.size,
|
|
72
|
-
running: this.running
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
/**
|
|
77
|
-
* ContractSpec tool consumer for external agents.
|
|
78
|
-
*/
|
|
79
|
-
var ContractSpecToolConsumer = class {
|
|
80
|
-
tools;
|
|
81
|
-
constructor(config) {
|
|
82
|
-
this.tools = /* @__PURE__ */ new Map();
|
|
83
|
-
for (const tool of config.tools) this.tools.set(tool.config.name, tool);
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Create an MCP server exposing the tools.
|
|
87
|
-
*/
|
|
88
|
-
createToolServer(config) {
|
|
89
|
-
return new MCPToolServer({
|
|
90
|
-
tools: Array.from(this.tools.values()),
|
|
91
|
-
...config
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Export tools for a specific SDK format.
|
|
96
|
-
*/
|
|
97
|
-
exportToolsForSDK(format) {
|
|
98
|
-
const tools = Array.from(this.tools.values());
|
|
99
|
-
const defaultContext = {
|
|
100
|
-
agentId: "export",
|
|
101
|
-
sessionId: "export"
|
|
102
|
-
};
|
|
103
|
-
switch (format) {
|
|
104
|
-
case "claude-agent": return tools.filter((tool) => !!tool.handler).map((tool) => specToolToClaudeAgentTool(tool.config, tool.handler, defaultContext));
|
|
105
|
-
case "opencode": return tools.map((tool) => specToolToOpenCodeTool(tool.config));
|
|
106
|
-
case "mcp": return tools.map((tool) => ({
|
|
107
|
-
name: tool.config.name,
|
|
108
|
-
description: tool.config.description ?? "",
|
|
109
|
-
inputSchema: tool.config.schema ?? {
|
|
110
|
-
type: "object",
|
|
111
|
-
properties: {}
|
|
112
|
-
}
|
|
113
|
-
}));
|
|
114
|
-
case "openai": return tools.map((tool) => ({
|
|
115
|
-
type: "function",
|
|
116
|
-
function: {
|
|
117
|
-
name: tool.config.name,
|
|
118
|
-
description: tool.config.description ?? "",
|
|
119
|
-
parameters: tool.config.schema ?? {
|
|
120
|
-
type: "object",
|
|
121
|
-
properties: {}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}));
|
|
125
|
-
default: throw new Error(`Unknown export format: ${format}`);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Create a bridged handler for a specific SDK.
|
|
130
|
-
*/
|
|
131
|
-
createBridgedHandler(toolName, _format) {
|
|
132
|
-
const tool = this.tools.get(toolName);
|
|
133
|
-
if (!tool || !tool.handler) return;
|
|
134
|
-
const handler = tool.handler;
|
|
135
|
-
return async (args) => {
|
|
136
|
-
return handler(args, {
|
|
137
|
-
agentId: "bridge",
|
|
138
|
-
sessionId: "bridge"
|
|
139
|
-
});
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Get all tools.
|
|
144
|
-
*/
|
|
145
|
-
getTools() {
|
|
146
|
-
return Array.from(this.tools.values()).map((t) => t.config);
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Get a specific tool.
|
|
150
|
-
*/
|
|
151
|
-
getTool(name) {
|
|
152
|
-
return this.tools.get(name)?.config;
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Check if a tool exists.
|
|
156
|
-
*/
|
|
157
|
-
hasTool(name) {
|
|
158
|
-
return this.tools.has(name);
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Execute a tool.
|
|
162
|
-
*/
|
|
163
|
-
async executeTool(name, args, context) {
|
|
164
|
-
const tool = this.tools.get(name);
|
|
165
|
-
if (!tool) throw new Error(`Tool not found: ${name}`);
|
|
166
|
-
if (!tool.handler) throw new Error(`No handler for tool: ${name}`);
|
|
167
|
-
const fullContext = {
|
|
168
|
-
agentId: context?.agentId ?? "consumer",
|
|
169
|
-
sessionId: context?.sessionId ?? "consumer-session",
|
|
170
|
-
tenantId: context?.tenantId,
|
|
171
|
-
actorId: context?.actorId,
|
|
172
|
-
metadata: context?.metadata,
|
|
173
|
-
signal: context?.signal
|
|
174
|
-
};
|
|
175
|
-
return await tool.handler(args, fullContext);
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Add a tool.
|
|
179
|
-
*/
|
|
180
|
-
addTool(config, handler) {
|
|
181
|
-
this.tools.set(config.name, {
|
|
182
|
-
config,
|
|
183
|
-
handler
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Remove a tool.
|
|
188
|
-
*/
|
|
189
|
-
removeTool(name) {
|
|
190
|
-
return this.tools.delete(name);
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Get tool count.
|
|
194
|
-
*/
|
|
195
|
-
getToolCount() {
|
|
196
|
-
return this.tools.size;
|
|
197
|
-
}
|
|
1
|
+
// @bun
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __export = (target, all) => {
|
|
4
|
+
for (var name in all)
|
|
5
|
+
__defProp(target, name, {
|
|
6
|
+
get: all[name],
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
set: (newValue) => all[name] = () => newValue
|
|
10
|
+
});
|
|
198
11
|
};
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
12
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
13
|
+
var __require = import.meta.require;
|
|
14
|
+
|
|
15
|
+
// src/providers/claude-agent-sdk/tool-bridge.ts
|
|
16
|
+
function specToolToClaudeAgentTool(tool, handler, context) {
|
|
17
|
+
return {
|
|
18
|
+
name: tool.name,
|
|
19
|
+
description: tool.description ?? `Execute ${tool.name}`,
|
|
20
|
+
input_schema: normalizeSchema(tool.schema),
|
|
21
|
+
requires_confirmation: tool.requiresApproval ?? !tool.automationSafe,
|
|
22
|
+
execute: async (input) => {
|
|
23
|
+
const fullContext = {
|
|
24
|
+
agentId: context.agentId ?? "unknown",
|
|
25
|
+
sessionId: context.sessionId ?? "unknown",
|
|
26
|
+
tenantId: context.tenantId,
|
|
27
|
+
actorId: context.actorId,
|
|
28
|
+
metadata: context.metadata,
|
|
29
|
+
signal: context.signal
|
|
30
|
+
};
|
|
31
|
+
return handler(input, fullContext);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function specToolsToClaudeAgentTools(tools, handlers, context) {
|
|
36
|
+
return tools.filter((tool) => handlers.has(tool.name)).map((tool) => {
|
|
37
|
+
const handler = handlers.get(tool.name);
|
|
38
|
+
if (!handler) {
|
|
39
|
+
throw new Error(`Handler not found for tool ${tool.name}`);
|
|
40
|
+
}
|
|
41
|
+
return specToolToClaudeAgentTool(tool, handler, context);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function claudeAgentToolToSpecTool(claudeTool, execute) {
|
|
45
|
+
const config = {
|
|
46
|
+
name: claudeTool.name,
|
|
47
|
+
description: claudeTool.description,
|
|
48
|
+
schema: claudeTool.input_schema,
|
|
49
|
+
requiresApproval: claudeTool.requires_confirmation,
|
|
50
|
+
automationSafe: !claudeTool.requires_confirmation
|
|
51
|
+
};
|
|
52
|
+
const handler = execute ? async (input, _ctx) => String(await execute(input)) : undefined;
|
|
53
|
+
return { config, handler };
|
|
54
|
+
}
|
|
55
|
+
function claudeAgentToolsToSpecTools(claudeTools) {
|
|
56
|
+
const configs = [];
|
|
57
|
+
const handlers = new Map;
|
|
58
|
+
for (const claudeTool of claudeTools) {
|
|
59
|
+
const { config, handler } = claudeAgentToolToSpecTool(claudeTool, claudeTool.execute);
|
|
60
|
+
configs.push(config);
|
|
61
|
+
if (handler) {
|
|
62
|
+
handlers.set(config.name, handler);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return { configs, handlers };
|
|
66
|
+
}
|
|
67
|
+
function specToolToExternalTool(tool, handler, context) {
|
|
68
|
+
return {
|
|
69
|
+
name: tool.name,
|
|
70
|
+
description: tool.description ?? `Execute ${tool.name}`,
|
|
71
|
+
inputSchema: tool.schema ?? { type: "object" },
|
|
72
|
+
requiresApproval: tool.requiresApproval ?? !tool.automationSafe,
|
|
73
|
+
execute: handler ? async (input) => {
|
|
74
|
+
const fullContext = {
|
|
75
|
+
agentId: context?.agentId ?? "unknown",
|
|
76
|
+
sessionId: context?.sessionId ?? "unknown",
|
|
77
|
+
tenantId: context?.tenantId,
|
|
78
|
+
actorId: context?.actorId,
|
|
79
|
+
metadata: context?.metadata,
|
|
80
|
+
signal: context?.signal
|
|
81
|
+
};
|
|
82
|
+
return handler(input, fullContext);
|
|
83
|
+
} : undefined
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function normalizeSchema(schema) {
|
|
87
|
+
if (!schema) {
|
|
88
|
+
return { type: "object" };
|
|
89
|
+
}
|
|
90
|
+
if (schema.type === "object") {
|
|
91
|
+
return schema;
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
type: "object",
|
|
95
|
+
properties: {
|
|
96
|
+
value: schema
|
|
97
|
+
},
|
|
98
|
+
required: ["value"]
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function extractToolCalls(response) {
|
|
102
|
+
if (!response.content) {
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
return response.content.filter((block) => block.type === "tool_use").map((block) => ({
|
|
106
|
+
toolCallId: block.id ?? "",
|
|
107
|
+
toolName: block.name ?? "",
|
|
108
|
+
args: block.input
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// src/providers/opencode-sdk/tool-bridge.ts
|
|
113
|
+
function specToolToOpenCodeTool(tool) {
|
|
114
|
+
return {
|
|
115
|
+
name: tool.name,
|
|
116
|
+
description: tool.description ?? `Execute ${tool.name}`,
|
|
117
|
+
parameters: normalizeToOpenCodeParameters(tool.schema),
|
|
118
|
+
permission: getPermissionLevel(tool)
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function specToolsToOpenCodeTools(tools) {
|
|
122
|
+
return tools.map(specToolToOpenCodeTool);
|
|
123
|
+
}
|
|
124
|
+
function getPermissionLevel(tool) {
|
|
125
|
+
if (tool.requiresApproval) {
|
|
126
|
+
return "ask";
|
|
127
|
+
}
|
|
128
|
+
if (tool.automationSafe === false) {
|
|
129
|
+
return "ask";
|
|
130
|
+
}
|
|
131
|
+
return "allow";
|
|
132
|
+
}
|
|
133
|
+
function openCodeToolToSpecTool(openCodeTool) {
|
|
134
|
+
return {
|
|
135
|
+
name: openCodeTool.name,
|
|
136
|
+
description: openCodeTool.description,
|
|
137
|
+
schema: openCodeTool.parameters,
|
|
138
|
+
requiresApproval: openCodeTool.permission === "ask",
|
|
139
|
+
automationSafe: openCodeTool.permission === "allow"
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function openCodeToolsToSpecTools(openCodeTools) {
|
|
143
|
+
return openCodeTools.map(openCodeToolToSpecTool);
|
|
144
|
+
}
|
|
145
|
+
function specToolToExternalToolForOpenCode(tool, handler, context) {
|
|
146
|
+
return {
|
|
147
|
+
name: tool.name,
|
|
148
|
+
description: tool.description ?? `Execute ${tool.name}`,
|
|
149
|
+
inputSchema: tool.schema ?? { type: "object" },
|
|
150
|
+
requiresApproval: tool.requiresApproval ?? !tool.automationSafe,
|
|
151
|
+
execute: handler ? async (input) => {
|
|
152
|
+
const fullContext = {
|
|
153
|
+
agentId: context?.agentId ?? "unknown",
|
|
154
|
+
sessionId: context?.sessionId ?? "unknown",
|
|
155
|
+
tenantId: context?.tenantId,
|
|
156
|
+
actorId: context?.actorId,
|
|
157
|
+
metadata: context?.metadata,
|
|
158
|
+
signal: context?.signal
|
|
159
|
+
};
|
|
160
|
+
return handler(input, fullContext);
|
|
161
|
+
} : undefined
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function normalizeToOpenCodeParameters(schema) {
|
|
165
|
+
if (!schema) {
|
|
166
|
+
return { type: "object" };
|
|
167
|
+
}
|
|
168
|
+
if (schema.type === "object") {
|
|
169
|
+
return {
|
|
170
|
+
type: "object",
|
|
171
|
+
properties: schema.properties,
|
|
172
|
+
required: schema.required
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
type: "object",
|
|
177
|
+
properties: {
|
|
178
|
+
value: convertToOpenCodeParameter(schema)
|
|
179
|
+
},
|
|
180
|
+
required: ["value"]
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
function convertToOpenCodeParameter(schema) {
|
|
184
|
+
const param = {
|
|
185
|
+
type: schema.type ?? "string"
|
|
186
|
+
};
|
|
187
|
+
if (schema.description) {
|
|
188
|
+
param.description = schema.description;
|
|
189
|
+
}
|
|
190
|
+
if (schema.enum) {
|
|
191
|
+
param.enum = schema.enum;
|
|
192
|
+
}
|
|
193
|
+
if (schema.default !== undefined) {
|
|
194
|
+
param.default = schema.default;
|
|
195
|
+
}
|
|
196
|
+
return param;
|
|
197
|
+
}
|
|
198
|
+
function createToolHandlerMap(tools) {
|
|
199
|
+
const handlers = new Map;
|
|
200
|
+
for (const [name, tool] of Object.entries(tools)) {
|
|
201
|
+
if (tool.execute) {
|
|
202
|
+
handlers.set(name, tool.execute);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return handlers;
|
|
206
|
+
}
|
|
207
|
+
async function executeToolCall(toolCall, handlers) {
|
|
208
|
+
const handler = handlers.get(toolCall.name);
|
|
209
|
+
if (!handler) {
|
|
210
|
+
return {
|
|
211
|
+
tool_call_id: toolCall.id,
|
|
212
|
+
output: `Error: Tool '${toolCall.name}' not found`,
|
|
213
|
+
is_error: true
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
try {
|
|
217
|
+
const result = await handler(toolCall.arguments);
|
|
218
|
+
return {
|
|
219
|
+
tool_call_id: toolCall.id,
|
|
220
|
+
output: typeof result === "string" ? result : JSON.stringify(result)
|
|
221
|
+
};
|
|
222
|
+
} catch (error) {
|
|
223
|
+
return {
|
|
224
|
+
tool_call_id: toolCall.id,
|
|
225
|
+
output: `Error: ${error instanceof Error ? error.message : String(error)}`,
|
|
226
|
+
is_error: true
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// src/interop/tool-consumer.ts
|
|
232
|
+
class MCPToolServer {
|
|
233
|
+
tools;
|
|
234
|
+
name;
|
|
235
|
+
version;
|
|
236
|
+
running = false;
|
|
237
|
+
constructor(config) {
|
|
238
|
+
this.tools = new Map;
|
|
239
|
+
this.name = config.name ?? "contractspec-tools";
|
|
240
|
+
this.version = config.version ?? "1.0.0";
|
|
241
|
+
for (const tool of config.tools) {
|
|
242
|
+
this.tools.set(tool.config.name, tool);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
async start() {
|
|
246
|
+
if (this.running) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
this.running = true;
|
|
250
|
+
console.log(`[MCPToolServer] Started ${this.name}@${this.version} with ${this.tools.size} tools`);
|
|
251
|
+
}
|
|
252
|
+
async stop() {
|
|
253
|
+
if (!this.running) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
this.running = false;
|
|
257
|
+
console.log(`[MCPToolServer] Stopped ${this.name}`);
|
|
258
|
+
}
|
|
259
|
+
isRunning() {
|
|
260
|
+
return this.running;
|
|
261
|
+
}
|
|
262
|
+
getTools() {
|
|
263
|
+
return Array.from(this.tools.values()).map((t) => t.config);
|
|
264
|
+
}
|
|
265
|
+
async executeTool(toolName, args, context) {
|
|
266
|
+
const tool = this.tools.get(toolName);
|
|
267
|
+
if (!tool) {
|
|
268
|
+
throw new Error(`Tool not found: ${toolName}`);
|
|
269
|
+
}
|
|
270
|
+
if (!tool.handler) {
|
|
271
|
+
throw new Error(`No handler registered for tool: ${toolName}`);
|
|
272
|
+
}
|
|
273
|
+
const fullContext = {
|
|
274
|
+
agentId: context?.agentId ?? "mcp-server",
|
|
275
|
+
sessionId: context?.sessionId ?? "mcp-session",
|
|
276
|
+
tenantId: context?.tenantId,
|
|
277
|
+
actorId: context?.actorId,
|
|
278
|
+
metadata: context?.metadata,
|
|
279
|
+
signal: context?.signal
|
|
280
|
+
};
|
|
281
|
+
return await tool.handler(args, fullContext);
|
|
282
|
+
}
|
|
283
|
+
getMCPToolDefinitions() {
|
|
284
|
+
const definitions = [];
|
|
285
|
+
for (const [name, tool] of this.tools) {
|
|
286
|
+
definitions.push({
|
|
287
|
+
name,
|
|
288
|
+
description: tool.config.description ?? "",
|
|
289
|
+
inputSchema: tool.config.schema ?? { type: "object", properties: {} }
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
return definitions;
|
|
293
|
+
}
|
|
294
|
+
getServerInfo() {
|
|
295
|
+
return {
|
|
296
|
+
name: this.name,
|
|
297
|
+
version: this.version,
|
|
298
|
+
tools: this.tools.size,
|
|
299
|
+
running: this.running
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
class ContractSpecToolConsumer {
|
|
305
|
+
tools;
|
|
306
|
+
constructor(config) {
|
|
307
|
+
this.tools = new Map;
|
|
308
|
+
for (const tool of config.tools) {
|
|
309
|
+
this.tools.set(tool.config.name, tool);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
createToolServer(config) {
|
|
313
|
+
return new MCPToolServer({
|
|
314
|
+
tools: Array.from(this.tools.values()),
|
|
315
|
+
...config
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
exportToolsForSDK(format) {
|
|
319
|
+
const tools = Array.from(this.tools.values());
|
|
320
|
+
const defaultContext = {
|
|
321
|
+
agentId: "export",
|
|
322
|
+
sessionId: "export"
|
|
323
|
+
};
|
|
324
|
+
switch (format) {
|
|
325
|
+
case "claude-agent":
|
|
326
|
+
return tools.filter((tool) => !!tool.handler).map((tool) => specToolToClaudeAgentTool(tool.config, tool.handler, defaultContext));
|
|
327
|
+
case "opencode":
|
|
328
|
+
return tools.map((tool) => specToolToOpenCodeTool(tool.config));
|
|
329
|
+
case "mcp":
|
|
330
|
+
return tools.map((tool) => ({
|
|
331
|
+
name: tool.config.name,
|
|
332
|
+
description: tool.config.description ?? "",
|
|
333
|
+
inputSchema: tool.config.schema ?? { type: "object", properties: {} }
|
|
334
|
+
}));
|
|
335
|
+
case "openai":
|
|
336
|
+
return tools.map((tool) => ({
|
|
337
|
+
type: "function",
|
|
338
|
+
function: {
|
|
339
|
+
name: tool.config.name,
|
|
340
|
+
description: tool.config.description ?? "",
|
|
341
|
+
parameters: tool.config.schema ?? {
|
|
342
|
+
type: "object",
|
|
343
|
+
properties: {}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}));
|
|
347
|
+
default:
|
|
348
|
+
throw new Error(`Unknown export format: ${format}`);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
createBridgedHandler(toolName, _format) {
|
|
352
|
+
const tool = this.tools.get(toolName);
|
|
353
|
+
if (!tool || !tool.handler) {
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
const handler = tool.handler;
|
|
357
|
+
return async (args) => {
|
|
358
|
+
const context = {
|
|
359
|
+
agentId: "bridge",
|
|
360
|
+
sessionId: "bridge"
|
|
361
|
+
};
|
|
362
|
+
return handler(args, context);
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
getTools() {
|
|
366
|
+
return Array.from(this.tools.values()).map((t) => t.config);
|
|
367
|
+
}
|
|
368
|
+
getTool(name) {
|
|
369
|
+
return this.tools.get(name)?.config;
|
|
370
|
+
}
|
|
371
|
+
hasTool(name) {
|
|
372
|
+
return this.tools.has(name);
|
|
373
|
+
}
|
|
374
|
+
async executeTool(name, args, context) {
|
|
375
|
+
const tool = this.tools.get(name);
|
|
376
|
+
if (!tool) {
|
|
377
|
+
throw new Error(`Tool not found: ${name}`);
|
|
378
|
+
}
|
|
379
|
+
if (!tool.handler) {
|
|
380
|
+
throw new Error(`No handler for tool: ${name}`);
|
|
381
|
+
}
|
|
382
|
+
const fullContext = {
|
|
383
|
+
agentId: context?.agentId ?? "consumer",
|
|
384
|
+
sessionId: context?.sessionId ?? "consumer-session",
|
|
385
|
+
tenantId: context?.tenantId,
|
|
386
|
+
actorId: context?.actorId,
|
|
387
|
+
metadata: context?.metadata,
|
|
388
|
+
signal: context?.signal
|
|
389
|
+
};
|
|
390
|
+
return await tool.handler(args, fullContext);
|
|
391
|
+
}
|
|
392
|
+
addTool(config, handler) {
|
|
393
|
+
this.tools.set(config.name, { config, handler });
|
|
394
|
+
}
|
|
395
|
+
removeTool(name) {
|
|
396
|
+
return this.tools.delete(name);
|
|
397
|
+
}
|
|
398
|
+
getToolCount() {
|
|
399
|
+
return this.tools.size;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
202
402
|
function createToolConsumer(config) {
|
|
203
|
-
|
|
403
|
+
return new ContractSpecToolConsumer(config);
|
|
204
404
|
}
|
|
205
|
-
/**
|
|
206
|
-
* Create an MCP tool server from tools.
|
|
207
|
-
*/
|
|
208
405
|
function createToolServer(config) {
|
|
209
|
-
|
|
406
|
+
return new MCPToolServer(config);
|
|
210
407
|
}
|
|
211
|
-
/**
|
|
212
|
-
* Export tools to a specific SDK format.
|
|
213
|
-
*/
|
|
214
408
|
function exportToolsForExternalSDK(tools, format) {
|
|
215
|
-
|
|
409
|
+
const consumer = new ContractSpecToolConsumer({
|
|
410
|
+
tools: tools.map((config) => ({ config }))
|
|
411
|
+
});
|
|
412
|
+
return consumer.exportToolsForSDK(format);
|
|
216
413
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
414
|
+
export {
|
|
415
|
+
exportToolsForExternalSDK,
|
|
416
|
+
createToolServer,
|
|
417
|
+
createToolConsumer,
|
|
418
|
+
ContractSpecToolConsumer
|
|
419
|
+
};
|