@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.
Files changed (232) hide show
  1. package/dist/agent/agent-factory.d.ts +67 -71
  2. package/dist/agent/agent-factory.d.ts.map +1 -1
  3. package/dist/agent/agent-factory.js +658 -100
  4. package/dist/agent/agent.test.d.ts +2 -0
  5. package/dist/agent/agent.test.d.ts.map +1 -0
  6. package/dist/agent/contract-spec-agent.d.ts +48 -52
  7. package/dist/agent/contract-spec-agent.d.ts.map +1 -1
  8. package/dist/agent/contract-spec-agent.js +605 -146
  9. package/dist/agent/index.d.ts +4 -4
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +2102 -4
  12. package/dist/agent/json-runner.d.ts +15 -19
  13. package/dist/agent/json-runner.d.ts.map +1 -1
  14. package/dist/agent/json-runner.js +672 -57
  15. package/dist/agent/json-runner.test.d.ts +2 -0
  16. package/dist/agent/json-runner.test.d.ts.map +1 -0
  17. package/dist/agent/unified-agent.d.ts +132 -109
  18. package/dist/agent/unified-agent.d.ts.map +1 -1
  19. package/dist/agent/unified-agent.js +2011 -293
  20. package/dist/approval/index.d.ts +3 -2
  21. package/dist/approval/index.d.ts.map +1 -0
  22. package/dist/approval/index.js +128 -2
  23. package/dist/approval/workflow.d.ts +106 -110
  24. package/dist/approval/workflow.d.ts.map +1 -1
  25. package/dist/approval/workflow.js +126 -157
  26. package/dist/exporters/claude-agent-exporter.d.ts +50 -48
  27. package/dist/exporters/claude-agent-exporter.d.ts.map +1 -1
  28. package/dist/exporters/claude-agent-exporter.js +258 -203
  29. package/dist/exporters/index.d.ts +28 -4
  30. package/dist/exporters/index.d.ts.map +1 -0
  31. package/dist/exporters/index.js +737 -3
  32. package/dist/exporters/opencode-exporter.d.ts +47 -45
  33. package/dist/exporters/opencode-exporter.d.ts.map +1 -1
  34. package/dist/exporters/opencode-exporter.js +507 -191
  35. package/dist/exporters/types.d.ts +171 -169
  36. package/dist/exporters/types.d.ts.map +1 -1
  37. package/dist/exporters/types.js +1 -0
  38. package/dist/index.d.ts +15 -39
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +3337 -32
  41. package/dist/interop/index.d.ts +48 -4
  42. package/dist/interop/index.d.ts.map +1 -0
  43. package/dist/interop/index.js +709 -3
  44. package/dist/interop/spec-consumer.d.ts +57 -53
  45. package/dist/interop/spec-consumer.d.ts.map +1 -1
  46. package/dist/interop/spec-consumer.js +302 -282
  47. package/dist/interop/tool-consumer.d.ts +57 -53
  48. package/dist/interop/tool-consumer.d.ts.map +1 -1
  49. package/dist/interop/tool-consumer.js +412 -213
  50. package/dist/interop/types.d.ts +173 -171
  51. package/dist/interop/types.d.ts.map +1 -1
  52. package/dist/interop/types.js +1 -0
  53. package/dist/knowledge/index.d.ts +2 -2
  54. package/dist/knowledge/index.d.ts.map +1 -0
  55. package/dist/knowledge/index.js +66 -2
  56. package/dist/knowledge/injector.d.ts +16 -20
  57. package/dist/knowledge/injector.d.ts.map +1 -1
  58. package/dist/knowledge/injector.js +56 -47
  59. package/dist/memory/in-memory.d.ts +15 -19
  60. package/dist/memory/in-memory.d.ts.map +1 -1
  61. package/dist/memory/in-memory.js +152 -46
  62. package/dist/memory/index.d.ts +3 -3
  63. package/dist/memory/index.d.ts.map +1 -0
  64. package/dist/memory/index.js +155 -3
  65. package/dist/memory/manager.d.ts +32 -36
  66. package/dist/memory/manager.d.ts.map +1 -1
  67. package/dist/memory/manager.js +96 -70
  68. package/dist/memory/memory.test.d.ts +2 -0
  69. package/dist/memory/memory.test.d.ts.map +1 -0
  70. package/dist/node/agent/agent-factory.js +661 -0
  71. package/dist/node/agent/contract-spec-agent.js +607 -0
  72. package/dist/node/agent/index.js +2103 -0
  73. package/dist/node/agent/json-runner.js +684 -0
  74. package/dist/node/agent/unified-agent.js +2019 -0
  75. package/dist/node/approval/index.js +129 -0
  76. package/dist/node/approval/workflow.js +129 -0
  77. package/dist/node/exporters/claude-agent-exporter.js +265 -0
  78. package/dist/node/exporters/index.js +738 -0
  79. package/dist/node/exporters/opencode-exporter.js +516 -0
  80. package/dist/node/exporters/types.js +0 -0
  81. package/dist/node/index.js +3337 -0
  82. package/dist/node/interop/index.js +710 -0
  83. package/dist/node/interop/spec-consumer.js +307 -0
  84. package/dist/node/interop/tool-consumer.js +419 -0
  85. package/dist/node/interop/types.js +0 -0
  86. package/dist/node/knowledge/index.js +67 -0
  87. package/dist/node/knowledge/injector.js +67 -0
  88. package/dist/node/memory/in-memory.js +154 -0
  89. package/dist/node/memory/index.js +156 -0
  90. package/dist/node/memory/manager.js +105 -0
  91. package/dist/node/providers/claude-agent-sdk/adapter.js +624 -0
  92. package/dist/node/providers/claude-agent-sdk/index.js +673 -0
  93. package/dist/node/providers/claude-agent-sdk/session-bridge.js +149 -0
  94. package/dist/node/providers/claude-agent-sdk/tool-bridge.js +118 -0
  95. package/dist/node/providers/index.js +1261 -0
  96. package/dist/node/providers/opencode-sdk/adapter.js +669 -0
  97. package/dist/node/providers/opencode-sdk/agent-bridge.js +299 -0
  98. package/dist/node/providers/opencode-sdk/index.js +703 -0
  99. package/dist/node/providers/opencode-sdk/tool-bridge.js +141 -0
  100. package/dist/node/providers/registry.js +89 -0
  101. package/dist/node/providers/types.js +56 -0
  102. package/dist/node/schema/index.js +195 -0
  103. package/dist/node/schema/json-schema-to-zod.js +152 -0
  104. package/dist/node/schema/schema-output.js +190 -0
  105. package/dist/node/session/index.js +90 -0
  106. package/dist/node/session/store.js +90 -0
  107. package/dist/node/spec/index.js +85 -0
  108. package/dist/node/spec/registry.js +56 -0
  109. package/dist/node/spec/spec.js +44 -0
  110. package/dist/node/telemetry/adapter.js +85 -0
  111. package/dist/node/telemetry/index.js +86 -0
  112. package/dist/node/tools/index.js +345 -0
  113. package/dist/node/tools/knowledge-tool.js +74 -0
  114. package/dist/node/tools/mcp-client.js +47 -0
  115. package/dist/node/tools/mcp-server.js +205 -0
  116. package/dist/node/tools/tool-adapter.js +197 -0
  117. package/dist/node/types.js +0 -0
  118. package/dist/providers/claude-agent-sdk/adapter.d.ts +60 -52
  119. package/dist/providers/claude-agent-sdk/adapter.d.ts.map +1 -1
  120. package/dist/providers/claude-agent-sdk/adapter.js +622 -304
  121. package/dist/providers/claude-agent-sdk/index.d.ts +22 -4
  122. package/dist/providers/claude-agent-sdk/index.d.ts.map +1 -0
  123. package/dist/providers/claude-agent-sdk/index.js +672 -4
  124. package/dist/providers/claude-agent-sdk/session-bridge.d.ts +43 -40
  125. package/dist/providers/claude-agent-sdk/session-bridge.d.ts.map +1 -1
  126. package/dist/providers/claude-agent-sdk/session-bridge.js +121 -130
  127. package/dist/providers/claude-agent-sdk/tool-bridge.d.ts +63 -60
  128. package/dist/providers/claude-agent-sdk/tool-bridge.d.ts.map +1 -1
  129. package/dist/providers/claude-agent-sdk/tool-bridge.js +104 -108
  130. package/dist/providers/index.d.ts +28 -7
  131. package/dist/providers/index.d.ts.map +1 -0
  132. package/dist/providers/index.js +1261 -8
  133. package/dist/providers/opencode-sdk/adapter.d.ts +56 -48
  134. package/dist/providers/opencode-sdk/adapter.d.ts.map +1 -1
  135. package/dist/providers/opencode-sdk/adapter.js +667 -274
  136. package/dist/providers/opencode-sdk/agent-bridge.d.ts +62 -57
  137. package/dist/providers/opencode-sdk/agent-bridge.d.ts.map +1 -1
  138. package/dist/providers/opencode-sdk/agent-bridge.js +289 -155
  139. package/dist/providers/opencode-sdk/index.d.ts +22 -4
  140. package/dist/providers/opencode-sdk/index.d.ts.map +1 -0
  141. package/dist/providers/opencode-sdk/index.js +702 -4
  142. package/dist/providers/opencode-sdk/tool-bridge.d.ts +41 -42
  143. package/dist/providers/opencode-sdk/tool-bridge.d.ts.map +1 -1
  144. package/dist/providers/opencode-sdk/tool-bridge.js +121 -107
  145. package/dist/providers/registry.d.ts +10 -11
  146. package/dist/providers/registry.d.ts.map +1 -1
  147. package/dist/providers/registry.js +86 -49
  148. package/dist/providers/types.d.ts +169 -166
  149. package/dist/providers/types.d.ts.map +1 -1
  150. package/dist/providers/types.js +54 -42
  151. package/dist/schema/index.d.ts +3 -3
  152. package/dist/schema/index.d.ts.map +1 -0
  153. package/dist/schema/index.js +194 -3
  154. package/dist/schema/json-schema-to-zod.d.ts +23 -26
  155. package/dist/schema/json-schema-to-zod.d.ts.map +1 -1
  156. package/dist/schema/json-schema-to-zod.js +138 -110
  157. package/dist/schema/schema-output.d.ts +29 -32
  158. package/dist/schema/schema-output.d.ts.map +1 -1
  159. package/dist/schema/schema-output.js +178 -53
  160. package/dist/session/index.d.ts +2 -2
  161. package/dist/session/index.d.ts.map +1 -0
  162. package/dist/session/index.js +89 -2
  163. package/dist/session/store.d.ts +51 -55
  164. package/dist/session/store.d.ts.map +1 -1
  165. package/dist/session/store.js +85 -74
  166. package/dist/spec/index.d.ts +3 -3
  167. package/dist/spec/index.d.ts.map +1 -0
  168. package/dist/spec/index.js +84 -3
  169. package/dist/spec/registry.d.ts +32 -36
  170. package/dist/spec/registry.d.ts.map +1 -1
  171. package/dist/spec/registry.js +51 -60
  172. package/dist/spec/spec.d.ts +80 -84
  173. package/dist/spec/spec.d.ts.map +1 -1
  174. package/dist/spec/spec.js +40 -26
  175. package/dist/telemetry/adapter.d.ts +33 -37
  176. package/dist/telemetry/adapter.d.ts.map +1 -1
  177. package/dist/telemetry/adapter.js +78 -96
  178. package/dist/telemetry/index.d.ts +2 -2
  179. package/dist/telemetry/index.d.ts.map +1 -0
  180. package/dist/telemetry/index.js +85 -2
  181. package/dist/tools/index.d.ts +5 -5
  182. package/dist/tools/index.d.ts.map +1 -0
  183. package/dist/tools/index.js +344 -5
  184. package/dist/tools/knowledge-tool.d.ts +4 -8
  185. package/dist/tools/knowledge-tool.d.ts.map +1 -1
  186. package/dist/tools/knowledge-tool.js +68 -48
  187. package/dist/tools/mcp-client.d.ts +17 -21
  188. package/dist/tools/mcp-client.d.ts.map +1 -1
  189. package/dist/tools/mcp-client.js +42 -53
  190. package/dist/tools/mcp-server.d.ts +14 -18
  191. package/dist/tools/mcp-server.d.ts.map +1 -1
  192. package/dist/tools/mcp-server.js +200 -64
  193. package/dist/tools/tool-adapter.d.ts +7 -11
  194. package/dist/tools/tool-adapter.d.ts.map +1 -1
  195. package/dist/tools/tool-adapter.js +187 -70
  196. package/dist/tools/tools.test.d.ts +2 -0
  197. package/dist/tools/tools.test.d.ts.map +1 -0
  198. package/dist/types.d.ts +108 -111
  199. package/dist/types.d.ts.map +1 -1
  200. package/dist/types.js +1 -0
  201. package/package.json +448 -90
  202. package/dist/_virtual/_rolldown/runtime.js +0 -8
  203. package/dist/agent/agent-factory.js.map +0 -1
  204. package/dist/agent/contract-spec-agent.js.map +0 -1
  205. package/dist/agent/json-runner.js.map +0 -1
  206. package/dist/agent/unified-agent.js.map +0 -1
  207. package/dist/approval/workflow.js.map +0 -1
  208. package/dist/exporters/claude-agent-exporter.js.map +0 -1
  209. package/dist/exporters/opencode-exporter.js.map +0 -1
  210. package/dist/interop/spec-consumer.js.map +0 -1
  211. package/dist/interop/tool-consumer.js.map +0 -1
  212. package/dist/knowledge/injector.js.map +0 -1
  213. package/dist/memory/in-memory.js.map +0 -1
  214. package/dist/memory/manager.js.map +0 -1
  215. package/dist/providers/claude-agent-sdk/adapter.js.map +0 -1
  216. package/dist/providers/claude-agent-sdk/session-bridge.js.map +0 -1
  217. package/dist/providers/claude-agent-sdk/tool-bridge.js.map +0 -1
  218. package/dist/providers/opencode-sdk/adapter.js.map +0 -1
  219. package/dist/providers/opencode-sdk/agent-bridge.js.map +0 -1
  220. package/dist/providers/opencode-sdk/tool-bridge.js.map +0 -1
  221. package/dist/providers/registry.js.map +0 -1
  222. package/dist/providers/types.js.map +0 -1
  223. package/dist/schema/json-schema-to-zod.js.map +0 -1
  224. package/dist/schema/schema-output.js.map +0 -1
  225. package/dist/session/store.js.map +0 -1
  226. package/dist/spec/registry.js.map +0 -1
  227. package/dist/spec/spec.js.map +0 -1
  228. package/dist/telemetry/adapter.js.map +0 -1
  229. package/dist/tools/knowledge-tool.js.map +0 -1
  230. package/dist/tools/mcp-client.js.map +0 -1
  231. package/dist/tools/mcp-server.js.map +0 -1
  232. package/dist/tools/tool-adapter.js.map +0 -1
@@ -1,220 +1,419 @@
1
- import { specToolToClaudeAgentTool } from "../providers/claude-agent-sdk/tool-bridge.js";
2
- import { specToolToOpenCodeTool } from "../providers/opencode-sdk/tool-bridge.js";
3
-
4
- //#region src/interop/tool-consumer.ts
5
- /**
6
- * Simple MCP-compatible tool server.
7
- */
8
- var MCPToolServer = class {
9
- tools;
10
- name;
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
- * Create a new tool consumer.
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
- return new ContractSpecToolConsumer(config);
403
+ return new ContractSpecToolConsumer(config);
204
404
  }
205
- /**
206
- * Create an MCP tool server from tools.
207
- */
208
405
  function createToolServer(config) {
209
- return new MCPToolServer(config);
406
+ return new MCPToolServer(config);
210
407
  }
211
- /**
212
- * Export tools to a specific SDK format.
213
- */
214
408
  function exportToolsForExternalSDK(tools, format) {
215
- return new ContractSpecToolConsumer({ tools: tools.map((config) => ({ config })) }).exportToolsForSDK(format);
409
+ const consumer = new ContractSpecToolConsumer({
410
+ tools: tools.map((config) => ({ config }))
411
+ });
412
+ return consumer.exportToolsForSDK(format);
216
413
  }
217
-
218
- //#endregion
219
- export { ContractSpecToolConsumer, createToolConsumer, createToolServer, exportToolsForExternalSDK };
220
- //# sourceMappingURL=tool-consumer.js.map
414
+ export {
415
+ exportToolsForExternalSDK,
416
+ createToolServer,
417
+ createToolConsumer,
418
+ ContractSpecToolConsumer
419
+ };