@contractspec/lib.ai-agent 1.45.6 → 1.46.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/_virtual/rolldown_runtime.js +8 -0
- package/dist/agent/index.d.ts +2 -2
- package/dist/agent/index.js +2 -2
- package/dist/agent/unified-agent.d.ts +131 -0
- package/dist/agent/unified-agent.d.ts.map +1 -0
- package/dist/agent/unified-agent.js +267 -0
- package/dist/agent/unified-agent.js.map +1 -0
- package/dist/exporters/claude-agent-exporter.d.ts +64 -0
- package/dist/exporters/claude-agent-exporter.d.ts.map +1 -0
- package/dist/exporters/claude-agent-exporter.js +210 -0
- package/dist/exporters/claude-agent-exporter.js.map +1 -0
- package/dist/exporters/index.d.ts +4 -0
- package/dist/exporters/index.js +4 -0
- package/dist/exporters/opencode-exporter.d.ts +64 -0
- package/dist/exporters/opencode-exporter.d.ts.map +1 -0
- package/dist/exporters/opencode-exporter.js +200 -0
- package/dist/exporters/opencode-exporter.js.map +1 -0
- package/dist/exporters/types.d.ts +239 -0
- package/dist/exporters/types.d.ts.map +1 -0
- package/dist/exporters/types.js +0 -0
- package/dist/index.d.ts +16 -3
- package/dist/index.js +11 -2
- package/dist/interop/index.d.ts +4 -0
- package/dist/interop/index.js +4 -0
- package/dist/interop/spec-consumer.d.ts +81 -0
- package/dist/interop/spec-consumer.d.ts.map +1 -0
- package/dist/interop/spec-consumer.js +287 -0
- package/dist/interop/spec-consumer.js.map +1 -0
- package/dist/interop/tool-consumer.d.ts +68 -0
- package/dist/interop/tool-consumer.d.ts.map +1 -0
- package/dist/interop/tool-consumer.js +220 -0
- package/dist/interop/tool-consumer.js.map +1 -0
- package/dist/interop/types.d.ts +262 -0
- package/dist/interop/types.d.ts.map +1 -0
- package/dist/interop/types.js +0 -0
- package/dist/providers/claude-agent-sdk/adapter.d.ts +58 -0
- package/dist/providers/claude-agent-sdk/adapter.d.ts.map +1 -0
- package/dist/providers/claude-agent-sdk/adapter.js +306 -0
- package/dist/providers/claude-agent-sdk/adapter.js.map +1 -0
- package/dist/providers/claude-agent-sdk/index.d.ts +4 -0
- package/dist/providers/claude-agent-sdk/index.js +5 -0
- package/dist/providers/claude-agent-sdk/session-bridge.d.ts +101 -0
- package/dist/providers/claude-agent-sdk/session-bridge.d.ts.map +1 -0
- package/dist/providers/claude-agent-sdk/session-bridge.js +158 -0
- package/dist/providers/claude-agent-sdk/session-bridge.js.map +1 -0
- package/dist/providers/claude-agent-sdk/tool-bridge.d.ts +110 -0
- package/dist/providers/claude-agent-sdk/tool-bridge.d.ts.map +1 -0
- package/dist/providers/claude-agent-sdk/tool-bridge.js +122 -0
- package/dist/providers/claude-agent-sdk/tool-bridge.js.map +1 -0
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/opencode-sdk/adapter.d.ts +54 -0
- package/dist/providers/opencode-sdk/adapter.d.ts.map +1 -0
- package/dist/providers/opencode-sdk/adapter.js +276 -0
- package/dist/providers/opencode-sdk/adapter.js.map +1 -0
- package/dist/providers/opencode-sdk/agent-bridge.d.ts +94 -0
- package/dist/providers/opencode-sdk/agent-bridge.d.ts.map +1 -0
- package/dist/providers/opencode-sdk/agent-bridge.js +165 -0
- package/dist/providers/opencode-sdk/agent-bridge.js.map +1 -0
- package/dist/providers/opencode-sdk/index.d.ts +4 -0
- package/dist/providers/opencode-sdk/index.js +5 -0
- package/dist/providers/opencode-sdk/tool-bridge.d.ts +81 -0
- package/dist/providers/opencode-sdk/tool-bridge.d.ts.map +1 -0
- package/dist/providers/opencode-sdk/tool-bridge.js +127 -0
- package/dist/providers/opencode-sdk/tool-bridge.js.map +1 -0
- package/dist/providers/registry.d.ts +22 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +52 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +243 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +44 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/tools/index.d.ts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +37 -5
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { AgentToolConfig } from "../../spec/spec.js";
|
|
2
|
+
import { ToolExecutionContext, ToolHandler } from "../../types.js";
|
|
3
|
+
import { ExternalToolDefinition } from "../types.js";
|
|
4
|
+
|
|
5
|
+
//#region src/providers/opencode-sdk/tool-bridge.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* OpenCode SDK tool definition.
|
|
9
|
+
*/
|
|
10
|
+
interface OpenCodeTool {
|
|
11
|
+
/** Tool name */
|
|
12
|
+
name: string;
|
|
13
|
+
/** Tool description */
|
|
14
|
+
description: string;
|
|
15
|
+
/** Input parameters schema */
|
|
16
|
+
parameters: {
|
|
17
|
+
type: 'object';
|
|
18
|
+
properties?: Record<string, OpenCodeParameter>;
|
|
19
|
+
required?: string[];
|
|
20
|
+
};
|
|
21
|
+
/** Tool category */
|
|
22
|
+
category?: string;
|
|
23
|
+
/** Permission level */
|
|
24
|
+
permission?: 'allow' | 'ask' | 'deny';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* OpenCode parameter definition.
|
|
28
|
+
*/
|
|
29
|
+
interface OpenCodeParameter {
|
|
30
|
+
type: string;
|
|
31
|
+
description?: string;
|
|
32
|
+
enum?: string[];
|
|
33
|
+
default?: unknown;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* OpenCode tool call from session.
|
|
37
|
+
*/
|
|
38
|
+
interface OpenCodeToolCall {
|
|
39
|
+
id: string;
|
|
40
|
+
name: string;
|
|
41
|
+
arguments: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* OpenCode tool result.
|
|
45
|
+
*/
|
|
46
|
+
interface OpenCodeToolResult {
|
|
47
|
+
tool_call_id: string;
|
|
48
|
+
output: string;
|
|
49
|
+
is_error?: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Convert a ContractSpec AgentToolConfig to OpenCode tool format.
|
|
53
|
+
*/
|
|
54
|
+
declare function specToolToOpenCodeTool(tool: AgentToolConfig): OpenCodeTool;
|
|
55
|
+
/**
|
|
56
|
+
* Convert multiple ContractSpec tools to OpenCode format.
|
|
57
|
+
*/
|
|
58
|
+
declare function specToolsToOpenCodeTools(tools: AgentToolConfig[]): OpenCodeTool[];
|
|
59
|
+
/**
|
|
60
|
+
* Convert an OpenCode tool to ContractSpec AgentToolConfig.
|
|
61
|
+
*/
|
|
62
|
+
declare function openCodeToolToSpecTool(openCodeTool: OpenCodeTool): AgentToolConfig;
|
|
63
|
+
/**
|
|
64
|
+
* Convert multiple OpenCode tools to ContractSpec format.
|
|
65
|
+
*/
|
|
66
|
+
declare function openCodeToolsToSpecTools(openCodeTools: OpenCodeTool[]): AgentToolConfig[];
|
|
67
|
+
/**
|
|
68
|
+
* Convert ContractSpec tool to ExternalToolDefinition format for OpenCode.
|
|
69
|
+
*/
|
|
70
|
+
declare function specToolToExternalToolForOpenCode(tool: AgentToolConfig, handler?: ToolHandler, context?: Partial<ToolExecutionContext>): ExternalToolDefinition;
|
|
71
|
+
/**
|
|
72
|
+
* Create a tool handler map from ExternalToolSet.
|
|
73
|
+
*/
|
|
74
|
+
declare function createToolHandlerMap(tools: Record<string, ExternalToolDefinition>): Map<string, (input: unknown) => Promise<unknown>>;
|
|
75
|
+
/**
|
|
76
|
+
* Execute a tool call and format the result.
|
|
77
|
+
*/
|
|
78
|
+
declare function executeToolCall(toolCall: OpenCodeToolCall, handlers: Map<string, (input: unknown) => Promise<unknown>>): Promise<OpenCodeToolResult>;
|
|
79
|
+
//#endregion
|
|
80
|
+
export { OpenCodeParameter, OpenCodeTool, OpenCodeToolCall, OpenCodeToolResult, createToolHandlerMap, executeToolCall, openCodeToolToSpecTool, openCodeToolsToSpecTools, specToolToExternalToolForOpenCode, specToolToOpenCodeTool, specToolsToOpenCodeTools };
|
|
81
|
+
//# sourceMappingURL=tool-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-bridge.d.ts","names":[],"sources":["../../../src/providers/opencode-sdk/tool-bridge.ts"],"sourcesContent":[],"mappings":";;;;;;AAmCA;AAUA;AASA;AAagB,UApDC,YAAA,CAoDqB;EAatB;EA0BA,IAAA,EAAA,MAAA;EAgBA;EAaA,WAAA,EAAA,MAAA;EACR;EACI,UAAA,EAAA;IACQ,IAAA,EAAA,QAAA;IAAR,UAAA,CAAA,EAnHK,MAmHL,CAAA,MAAA,EAnHoB,iBAmHpB,CAAA;IACT,QAAA,CAAA,EAAA,MAAA,EAAA;EAAsB,CAAA;EAyFT;EACQ,QAAA,CAAA,EAAA,MAAA;EAAf;EAC0B,UAAA,CAAA,EAAA,OAAA,GAAA,KAAA,GAAA,MAAA;;;AAenC;;AAE4C,UApN3B,iBAAA,CAoN2B;EAAhC,IAAA,EAAA,MAAA;EACD,WAAA,CAAA,EAAA,MAAA;EAAR,IAAA,CAAA,EAAA,MAAA,EAAA;EAAO,OAAA,CAAA,EAAA,OAAA;;;;;UA3MO,gBAAA;;;aAGJ;;;;;UAMI,kBAAA;;;;;;;;iBAaD,sBAAA,OAA6B,kBAAkB;;;;iBAa/C,wBAAA,QACP,oBACN;;;;iBAwBa,sBAAA,eACA,eACb;;;;iBAca,wBAAA,gBACC,iBACd;;;;iBAWa,iCAAA,OACR,2BACI,uBACA,QAAQ,wBACjB;;;;iBAyFa,oBAAA,QACP,eAAe,0BACrB,gCAAgC;;;;iBAeb,eAAA,WACV,4BACA,gCAAgC,oBACzC,QAAQ"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
//#region src/providers/opencode-sdk/tool-bridge.ts
|
|
2
|
+
/**
|
|
3
|
+
* Convert a ContractSpec AgentToolConfig to OpenCode tool format.
|
|
4
|
+
*/
|
|
5
|
+
function specToolToOpenCodeTool(tool) {
|
|
6
|
+
return {
|
|
7
|
+
name: tool.name,
|
|
8
|
+
description: tool.description ?? `Execute ${tool.name}`,
|
|
9
|
+
parameters: normalizeToOpenCodeParameters(tool.schema),
|
|
10
|
+
permission: getPermissionLevel(tool)
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Convert multiple ContractSpec tools to OpenCode format.
|
|
15
|
+
*/
|
|
16
|
+
function specToolsToOpenCodeTools(tools) {
|
|
17
|
+
return tools.map(specToolToOpenCodeTool);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Determine permission level from tool config.
|
|
21
|
+
*/
|
|
22
|
+
function getPermissionLevel(tool) {
|
|
23
|
+
if (tool.requiresApproval) return "ask";
|
|
24
|
+
if (tool.automationSafe === false) return "ask";
|
|
25
|
+
return "allow";
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Convert an OpenCode tool to ContractSpec AgentToolConfig.
|
|
29
|
+
*/
|
|
30
|
+
function openCodeToolToSpecTool(openCodeTool) {
|
|
31
|
+
return {
|
|
32
|
+
name: openCodeTool.name,
|
|
33
|
+
description: openCodeTool.description,
|
|
34
|
+
schema: openCodeTool.parameters,
|
|
35
|
+
requiresApproval: openCodeTool.permission === "ask",
|
|
36
|
+
automationSafe: openCodeTool.permission === "allow"
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Convert multiple OpenCode tools to ContractSpec format.
|
|
41
|
+
*/
|
|
42
|
+
function openCodeToolsToSpecTools(openCodeTools) {
|
|
43
|
+
return openCodeTools.map(openCodeToolToSpecTool);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Convert ContractSpec tool to ExternalToolDefinition format for OpenCode.
|
|
47
|
+
*/
|
|
48
|
+
function specToolToExternalToolForOpenCode(tool, handler, context) {
|
|
49
|
+
return {
|
|
50
|
+
name: tool.name,
|
|
51
|
+
description: tool.description ?? `Execute ${tool.name}`,
|
|
52
|
+
inputSchema: tool.schema ?? { type: "object" },
|
|
53
|
+
requiresApproval: tool.requiresApproval ?? !tool.automationSafe,
|
|
54
|
+
execute: handler ? async (input) => {
|
|
55
|
+
return handler(input, {
|
|
56
|
+
agentId: context?.agentId ?? "unknown",
|
|
57
|
+
sessionId: context?.sessionId ?? "unknown",
|
|
58
|
+
tenantId: context?.tenantId,
|
|
59
|
+
actorId: context?.actorId,
|
|
60
|
+
metadata: context?.metadata,
|
|
61
|
+
signal: context?.signal
|
|
62
|
+
});
|
|
63
|
+
} : void 0
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Normalize a schema to OpenCode's expected parameter format.
|
|
68
|
+
*/
|
|
69
|
+
function normalizeToOpenCodeParameters(schema) {
|
|
70
|
+
if (!schema) return { type: "object" };
|
|
71
|
+
if (schema.type === "object") return {
|
|
72
|
+
type: "object",
|
|
73
|
+
properties: schema.properties,
|
|
74
|
+
required: schema.required
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
type: "object",
|
|
78
|
+
properties: { value: convertToOpenCodeParameter(schema) },
|
|
79
|
+
required: ["value"]
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Convert a JSON Schema property to OpenCode parameter format.
|
|
84
|
+
*/
|
|
85
|
+
function convertToOpenCodeParameter(schema) {
|
|
86
|
+
const param = { type: schema.type ?? "string" };
|
|
87
|
+
if (schema.description) param.description = schema.description;
|
|
88
|
+
if (schema.enum) param.enum = schema.enum;
|
|
89
|
+
if (schema.default !== void 0) param.default = schema.default;
|
|
90
|
+
return param;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create a tool handler map from ExternalToolSet.
|
|
94
|
+
*/
|
|
95
|
+
function createToolHandlerMap(tools) {
|
|
96
|
+
const handlers = /* @__PURE__ */ new Map();
|
|
97
|
+
for (const [name, tool] of Object.entries(tools)) if (tool.execute) handlers.set(name, tool.execute);
|
|
98
|
+
return handlers;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Execute a tool call and format the result.
|
|
102
|
+
*/
|
|
103
|
+
async function executeToolCall(toolCall, handlers) {
|
|
104
|
+
const handler = handlers.get(toolCall.name);
|
|
105
|
+
if (!handler) return {
|
|
106
|
+
tool_call_id: toolCall.id,
|
|
107
|
+
output: `Error: Tool '${toolCall.name}' not found`,
|
|
108
|
+
is_error: true
|
|
109
|
+
};
|
|
110
|
+
try {
|
|
111
|
+
const result = await handler(toolCall.arguments);
|
|
112
|
+
return {
|
|
113
|
+
tool_call_id: toolCall.id,
|
|
114
|
+
output: typeof result === "string" ? result : JSON.stringify(result)
|
|
115
|
+
};
|
|
116
|
+
} catch (error) {
|
|
117
|
+
return {
|
|
118
|
+
tool_call_id: toolCall.id,
|
|
119
|
+
output: `Error: ${error instanceof Error ? error.message : String(error)}`,
|
|
120
|
+
is_error: true
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
//#endregion
|
|
126
|
+
export { createToolHandlerMap, executeToolCall, openCodeToolToSpecTool, openCodeToolsToSpecTools, specToolToExternalToolForOpenCode, specToolToOpenCodeTool, specToolsToOpenCodeTools };
|
|
127
|
+
//# sourceMappingURL=tool-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-bridge.js","names":["param: OpenCodeParameter"],"sources":["../../../src/providers/opencode-sdk/tool-bridge.ts"],"sourcesContent":["/**\n * Tool bridge for converting between ContractSpec and OpenCode SDK tool formats.\n */\n\nimport type { AgentToolConfig } from '../../spec/spec';\nimport type { ToolHandler, ToolExecutionContext } from '../../types';\nimport type { ExternalToolDefinition } from '../types';\n\n// ============================================================================\n// OpenCode SDK Tool Types\n// ============================================================================\n\n/**\n * OpenCode SDK tool definition.\n */\nexport interface OpenCodeTool {\n /** Tool name */\n name: string;\n /** Tool description */\n description: string;\n /** Input parameters schema */\n parameters: {\n type: 'object';\n properties?: Record<string, OpenCodeParameter>;\n required?: string[];\n };\n /** Tool category */\n category?: string;\n /** Permission level */\n permission?: 'allow' | 'ask' | 'deny';\n}\n\n/**\n * OpenCode parameter definition.\n */\nexport interface OpenCodeParameter {\n type: string;\n description?: string;\n enum?: string[];\n default?: unknown;\n}\n\n/**\n * OpenCode tool call from session.\n */\nexport interface OpenCodeToolCall {\n id: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\n/**\n * OpenCode tool result.\n */\nexport interface OpenCodeToolResult {\n tool_call_id: string;\n output: string;\n is_error?: boolean;\n}\n\n// ============================================================================\n// ContractSpec → OpenCode Conversion\n// ============================================================================\n\n/**\n * Convert a ContractSpec AgentToolConfig to OpenCode tool format.\n */\nexport function specToolToOpenCodeTool(tool: AgentToolConfig): OpenCodeTool {\n return {\n name: tool.name,\n description: tool.description ?? `Execute ${tool.name}`,\n parameters: normalizeToOpenCodeParameters(tool.schema),\n // category property not in AgentToolConfig\n permission: getPermissionLevel(tool),\n };\n}\n\n/**\n * Convert multiple ContractSpec tools to OpenCode format.\n */\nexport function specToolsToOpenCodeTools(\n tools: AgentToolConfig[]\n): OpenCodeTool[] {\n return tools.map(specToolToOpenCodeTool);\n}\n\n/**\n * Determine permission level from tool config.\n */\nfunction getPermissionLevel(tool: AgentToolConfig): OpenCodeTool['permission'] {\n if (tool.requiresApproval) {\n return 'ask';\n }\n if (tool.automationSafe === false) {\n return 'ask';\n }\n return 'allow';\n}\n\n// ============================================================================\n// OpenCode → ContractSpec Conversion\n// ============================================================================\n\n/**\n * Convert an OpenCode tool to ContractSpec AgentToolConfig.\n */\nexport function openCodeToolToSpecTool(\n openCodeTool: OpenCodeTool\n): AgentToolConfig {\n return {\n name: openCodeTool.name,\n description: openCodeTool.description,\n schema: openCodeTool.parameters,\n requiresApproval: openCodeTool.permission === 'ask',\n automationSafe: openCodeTool.permission === 'allow',\n // category property not in AgentToolConfig\n };\n}\n\n/**\n * Convert multiple OpenCode tools to ContractSpec format.\n */\nexport function openCodeToolsToSpecTools(\n openCodeTools: OpenCodeTool[]\n): AgentToolConfig[] {\n return openCodeTools.map(openCodeToolToSpecTool);\n}\n\n// ============================================================================\n// External Tool Definition Conversion\n// ============================================================================\n\n/**\n * Convert ContractSpec tool to ExternalToolDefinition format for OpenCode.\n */\nexport function specToolToExternalToolForOpenCode(\n tool: AgentToolConfig,\n handler?: ToolHandler,\n context?: Partial<ToolExecutionContext>\n): ExternalToolDefinition {\n return {\n name: tool.name,\n description: tool.description ?? `Execute ${tool.name}`,\n inputSchema: tool.schema ?? { type: 'object' },\n requiresApproval: tool.requiresApproval ?? !tool.automationSafe,\n execute: handler\n ? async (input) => {\n const fullContext: ToolExecutionContext = {\n agentId: context?.agentId ?? 'unknown',\n sessionId: context?.sessionId ?? 'unknown',\n tenantId: context?.tenantId,\n actorId: context?.actorId,\n metadata: context?.metadata,\n signal: context?.signal,\n };\n return handler(input, fullContext);\n }\n : undefined,\n };\n}\n\n// ============================================================================\n// Schema Conversion\n// ============================================================================\n\n/**\n * Normalize a schema to OpenCode's expected parameter format.\n */\nfunction normalizeToOpenCodeParameters(\n schema?: Record<string, unknown>\n): OpenCodeTool['parameters'] {\n if (!schema) {\n return { type: 'object' };\n }\n\n // Already in correct format\n if (schema.type === 'object') {\n return {\n type: 'object',\n properties: schema.properties as\n | Record<string, OpenCodeParameter>\n | undefined,\n required: schema.required as string[] | undefined,\n };\n }\n\n // Wrap non-object schemas\n return {\n type: 'object',\n properties: {\n value: convertToOpenCodeParameter(schema),\n },\n required: ['value'],\n };\n}\n\n/**\n * Convert a JSON Schema property to OpenCode parameter format.\n */\nfunction convertToOpenCodeParameter(\n schema: Record<string, unknown>\n): OpenCodeParameter {\n const param: OpenCodeParameter = {\n type: (schema.type as string) ?? 'string',\n };\n\n if (schema.description) {\n param.description = schema.description as string;\n }\n\n if (schema.enum) {\n param.enum = schema.enum as string[];\n }\n\n if (schema.default !== undefined) {\n param.default = schema.default;\n }\n\n return param;\n}\n\n// ============================================================================\n// Tool Execution Helpers\n// ============================================================================\n\n/**\n * Create a tool handler map from ExternalToolSet.\n */\nexport function createToolHandlerMap(\n tools: Record<string, ExternalToolDefinition>\n): Map<string, (input: unknown) => Promise<unknown>> {\n const handlers = new Map<string, (input: unknown) => Promise<unknown>>();\n\n for (const [name, tool] of Object.entries(tools)) {\n if (tool.execute) {\n handlers.set(name, tool.execute);\n }\n }\n\n return handlers;\n}\n\n/**\n * Execute a tool call and format the result.\n */\nexport async function executeToolCall(\n toolCall: OpenCodeToolCall,\n handlers: Map<string, (input: unknown) => Promise<unknown>>\n): Promise<OpenCodeToolResult> {\n const handler = handlers.get(toolCall.name);\n\n if (!handler) {\n return {\n tool_call_id: toolCall.id,\n output: `Error: Tool '${toolCall.name}' not found`,\n is_error: true,\n };\n }\n\n try {\n const result = await handler(toolCall.arguments);\n return {\n tool_call_id: toolCall.id,\n output: typeof result === 'string' ? result : JSON.stringify(result),\n };\n } catch (error) {\n return {\n tool_call_id: toolCall.id,\n output: `Error: ${error instanceof Error ? error.message : String(error)}`,\n is_error: true,\n };\n }\n}\n"],"mappings":";;;;AAmEA,SAAgB,uBAAuB,MAAqC;AAC1E,QAAO;EACL,MAAM,KAAK;EACX,aAAa,KAAK,eAAe,WAAW,KAAK;EACjD,YAAY,8BAA8B,KAAK,OAAO;EAEtD,YAAY,mBAAmB,KAAK;EACrC;;;;;AAMH,SAAgB,yBACd,OACgB;AAChB,QAAO,MAAM,IAAI,uBAAuB;;;;;AAM1C,SAAS,mBAAmB,MAAmD;AAC7E,KAAI,KAAK,iBACP,QAAO;AAET,KAAI,KAAK,mBAAmB,MAC1B,QAAO;AAET,QAAO;;;;;AAUT,SAAgB,uBACd,cACiB;AACjB,QAAO;EACL,MAAM,aAAa;EACnB,aAAa,aAAa;EAC1B,QAAQ,aAAa;EACrB,kBAAkB,aAAa,eAAe;EAC9C,gBAAgB,aAAa,eAAe;EAE7C;;;;;AAMH,SAAgB,yBACd,eACmB;AACnB,QAAO,cAAc,IAAI,uBAAuB;;;;;AAUlD,SAAgB,kCACd,MACA,SACA,SACwB;AACxB,QAAO;EACL,MAAM,KAAK;EACX,aAAa,KAAK,eAAe,WAAW,KAAK;EACjD,aAAa,KAAK,UAAU,EAAE,MAAM,UAAU;EAC9C,kBAAkB,KAAK,oBAAoB,CAAC,KAAK;EACjD,SAAS,UACL,OAAO,UAAU;AASf,UAAO,QAAQ,OAR2B;IACxC,SAAS,SAAS,WAAW;IAC7B,WAAW,SAAS,aAAa;IACjC,UAAU,SAAS;IACnB,SAAS,SAAS;IAClB,UAAU,SAAS;IACnB,QAAQ,SAAS;IAClB,CACiC;MAEpC;EACL;;;;;AAUH,SAAS,8BACP,QAC4B;AAC5B,KAAI,CAAC,OACH,QAAO,EAAE,MAAM,UAAU;AAI3B,KAAI,OAAO,SAAS,SAClB,QAAO;EACL,MAAM;EACN,YAAY,OAAO;EAGnB,UAAU,OAAO;EAClB;AAIH,QAAO;EACL,MAAM;EACN,YAAY,EACV,OAAO,2BAA2B,OAAO,EAC1C;EACD,UAAU,CAAC,QAAQ;EACpB;;;;;AAMH,SAAS,2BACP,QACmB;CACnB,MAAMA,QAA2B,EAC/B,MAAO,OAAO,QAAmB,UAClC;AAED,KAAI,OAAO,YACT,OAAM,cAAc,OAAO;AAG7B,KAAI,OAAO,KACT,OAAM,OAAO,OAAO;AAGtB,KAAI,OAAO,YAAY,OACrB,OAAM,UAAU,OAAO;AAGzB,QAAO;;;;;AAUT,SAAgB,qBACd,OACmD;CACnD,MAAM,2BAAW,IAAI,KAAmD;AAExE,MAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,MAAM,CAC9C,KAAI,KAAK,QACP,UAAS,IAAI,MAAM,KAAK,QAAQ;AAIpC,QAAO;;;;;AAMT,eAAsB,gBACpB,UACA,UAC6B;CAC7B,MAAM,UAAU,SAAS,IAAI,SAAS,KAAK;AAE3C,KAAI,CAAC,QACH,QAAO;EACL,cAAc,SAAS;EACvB,QAAQ,gBAAgB,SAAS,KAAK;EACtC,UAAU;EACX;AAGH,KAAI;EACF,MAAM,SAAS,MAAM,QAAQ,SAAS,UAAU;AAChD,SAAO;GACL,cAAc,SAAS;GACvB,QAAQ,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,OAAO;GACrE;UACM,OAAO;AACd,SAAO;GACL,cAAc,SAAS;GACvB,QAAQ,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GACxE,UAAU;GACX"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ExternalAgentProvider, ProviderRegistry } from "./types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/providers/registry.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Create a new provider registry.
|
|
7
|
+
*/
|
|
8
|
+
declare function createProviderRegistry(): ProviderRegistry & {
|
|
9
|
+
require: (name: string) => ExternalAgentProvider;
|
|
10
|
+
clear: () => void;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Global default provider registry.
|
|
14
|
+
* Use this for convenience when you don't need multiple registries.
|
|
15
|
+
*/
|
|
16
|
+
declare const defaultProviderRegistry: ProviderRegistry & {
|
|
17
|
+
require: (name: string) => ExternalAgentProvider;
|
|
18
|
+
clear: () => void;
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
export { createProviderRegistry, defaultProviderRegistry };
|
|
22
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","names":[],"sources":["../../src/providers/registry.ts"],"sourcesContent":[],"mappings":";;;;AAqEA;;;iBAXgB,sBAAA,CAAA,GAA0B;6BACb;;;;;;;cAUhB,yBAAuB;6BAVP"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ProviderNotAvailableError } from "./types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/providers/registry.ts
|
|
4
|
+
/**
|
|
5
|
+
* In-memory implementation of the provider registry.
|
|
6
|
+
*/
|
|
7
|
+
var InMemoryProviderRegistry = class {
|
|
8
|
+
providers = /* @__PURE__ */ new Map();
|
|
9
|
+
get(name) {
|
|
10
|
+
return this.providers.get(name);
|
|
11
|
+
}
|
|
12
|
+
register(name, provider) {
|
|
13
|
+
this.providers.set(name, provider);
|
|
14
|
+
}
|
|
15
|
+
list() {
|
|
16
|
+
return Array.from(this.providers.keys());
|
|
17
|
+
}
|
|
18
|
+
isAvailable(name) {
|
|
19
|
+
const provider = this.providers.get(name);
|
|
20
|
+
return provider !== void 0 && provider.isAvailable();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get a provider, throwing if not found or not available.
|
|
24
|
+
*/
|
|
25
|
+
require(name) {
|
|
26
|
+
const provider = this.providers.get(name);
|
|
27
|
+
if (!provider) throw new ProviderNotAvailableError(name, "not registered");
|
|
28
|
+
if (!provider.isAvailable()) throw new ProviderNotAvailableError(name, "dependencies not installed or not configured");
|
|
29
|
+
return provider;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Clear all registered providers.
|
|
33
|
+
*/
|
|
34
|
+
clear() {
|
|
35
|
+
this.providers.clear();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Create a new provider registry.
|
|
40
|
+
*/
|
|
41
|
+
function createProviderRegistry() {
|
|
42
|
+
return new InMemoryProviderRegistry();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Global default provider registry.
|
|
46
|
+
* Use this for convenience when you don't need multiple registries.
|
|
47
|
+
*/
|
|
48
|
+
const defaultProviderRegistry = createProviderRegistry();
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
export { createProviderRegistry, defaultProviderRegistry };
|
|
52
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","names":[],"sources":["../../src/providers/registry.ts"],"sourcesContent":["/**\n * Provider registry for managing external SDK providers.\n */\n\nimport type { ExternalAgentProvider, ProviderRegistry } from './types';\nimport { ProviderNotAvailableError } from './types';\n\n/**\n * In-memory implementation of the provider registry.\n */\nclass InMemoryProviderRegistry implements ProviderRegistry {\n private providers = new Map<string, ExternalAgentProvider>();\n\n get(name: string): ExternalAgentProvider | undefined {\n return this.providers.get(name);\n }\n\n register(name: string, provider: ExternalAgentProvider): void {\n this.providers.set(name, provider);\n }\n\n list(): string[] {\n return Array.from(this.providers.keys());\n }\n\n isAvailable(name: string): boolean {\n const provider = this.providers.get(name);\n return provider !== undefined && provider.isAvailable();\n }\n\n /**\n * Get a provider, throwing if not found or not available.\n */\n require(name: string): ExternalAgentProvider {\n const provider = this.providers.get(name);\n if (!provider) {\n throw new ProviderNotAvailableError(name, 'not registered');\n }\n if (!provider.isAvailable()) {\n throw new ProviderNotAvailableError(\n name,\n 'dependencies not installed or not configured'\n );\n }\n return provider;\n }\n\n /**\n * Clear all registered providers.\n */\n clear(): void {\n this.providers.clear();\n }\n}\n\n/**\n * Create a new provider registry.\n */\nexport function createProviderRegistry(): ProviderRegistry & {\n require: (name: string) => ExternalAgentProvider;\n clear: () => void;\n} {\n return new InMemoryProviderRegistry();\n}\n\n/**\n * Global default provider registry.\n * Use this for convenience when you don't need multiple registries.\n */\nexport const defaultProviderRegistry = createProviderRegistry();\n"],"mappings":";;;;;;AAUA,IAAM,2BAAN,MAA2D;CACzD,AAAQ,4BAAY,IAAI,KAAoC;CAE5D,IAAI,MAAiD;AACnD,SAAO,KAAK,UAAU,IAAI,KAAK;;CAGjC,SAAS,MAAc,UAAuC;AAC5D,OAAK,UAAU,IAAI,MAAM,SAAS;;CAGpC,OAAiB;AACf,SAAO,MAAM,KAAK,KAAK,UAAU,MAAM,CAAC;;CAG1C,YAAY,MAAuB;EACjC,MAAM,WAAW,KAAK,UAAU,IAAI,KAAK;AACzC,SAAO,aAAa,UAAa,SAAS,aAAa;;;;;CAMzD,QAAQ,MAAqC;EAC3C,MAAM,WAAW,KAAK,UAAU,IAAI,KAAK;AACzC,MAAI,CAAC,SACH,OAAM,IAAI,0BAA0B,MAAM,iBAAiB;AAE7D,MAAI,CAAC,SAAS,aAAa,CACzB,OAAM,IAAI,0BACR,MACA,+CACD;AAEH,SAAO;;;;;CAMT,QAAc;AACZ,OAAK,UAAU,OAAO;;;;;;AAO1B,SAAgB,yBAGd;AACA,QAAO,IAAI,0BAA0B;;;;;;AAOvC,MAAa,0BAA0B,wBAAwB"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { AgentSpec } from "../spec/spec.js";
|
|
2
|
+
import { AgentCallOptions, AgentFinishReason, ToolCallInfo, ToolResultInfo } from "../types.js";
|
|
3
|
+
import { McpClientConfig } from "../tools/mcp-client.js";
|
|
4
|
+
|
|
5
|
+
//#region src/providers/types.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* External SDK provider interface for ContractSpec agents.
|
|
9
|
+
* Allows external SDKs to be used as execution backends.
|
|
10
|
+
*/
|
|
11
|
+
interface ExternalAgentProvider {
|
|
12
|
+
/** Provider name identifier */
|
|
13
|
+
readonly name: string;
|
|
14
|
+
/** Provider version */
|
|
15
|
+
readonly version: string;
|
|
16
|
+
/**
|
|
17
|
+
* Check if this provider is available (dependencies installed, configured).
|
|
18
|
+
* Should be a quick synchronous check.
|
|
19
|
+
*/
|
|
20
|
+
isAvailable(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Create an execution context from an AgentSpec.
|
|
23
|
+
* This prepares the provider for execution with the given spec.
|
|
24
|
+
*/
|
|
25
|
+
createContext(spec: AgentSpec): Promise<ExternalAgentContext>;
|
|
26
|
+
/**
|
|
27
|
+
* Execute a prompt using this provider.
|
|
28
|
+
* Non-streaming execution that returns the complete result.
|
|
29
|
+
*/
|
|
30
|
+
execute(context: ExternalAgentContext, params: ExternalExecuteParams): Promise<ExternalExecuteResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Stream execution with real-time updates.
|
|
33
|
+
* Returns an async iterable of stream chunks.
|
|
34
|
+
*/
|
|
35
|
+
stream(context: ExternalAgentContext, params: ExternalExecuteParams): AsyncIterable<ExternalStreamChunk>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Execution context created by a provider.
|
|
39
|
+
* Holds the prepared state for executing prompts.
|
|
40
|
+
*/
|
|
41
|
+
interface ExternalAgentContext {
|
|
42
|
+
/** Unique context ID */
|
|
43
|
+
id: string;
|
|
44
|
+
/** The spec this context was created from */
|
|
45
|
+
spec: AgentSpec;
|
|
46
|
+
/** Tools available in this context */
|
|
47
|
+
tools: ExternalToolSet;
|
|
48
|
+
/** Cleanup function to release resources */
|
|
49
|
+
cleanup: () => Promise<void>;
|
|
50
|
+
/** Provider-specific metadata */
|
|
51
|
+
metadata?: Record<string, unknown>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parameters for executing a prompt.
|
|
55
|
+
*/
|
|
56
|
+
interface ExternalExecuteParams {
|
|
57
|
+
/** The prompt to execute */
|
|
58
|
+
prompt: string;
|
|
59
|
+
/** Optional system prompt override/addition */
|
|
60
|
+
systemOverride?: string;
|
|
61
|
+
/** Call options (tenant, actor, session, metadata) */
|
|
62
|
+
options?: AgentCallOptions;
|
|
63
|
+
/** Abort signal for cancellation */
|
|
64
|
+
signal?: AbortSignal;
|
|
65
|
+
/** Maximum steps/iterations (provider may interpret differently) */
|
|
66
|
+
maxSteps?: number;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Result from a non-streaming execution.
|
|
70
|
+
*/
|
|
71
|
+
interface ExternalExecuteResult {
|
|
72
|
+
/** Final text response */
|
|
73
|
+
text: string;
|
|
74
|
+
/** Tool calls made during execution */
|
|
75
|
+
toolCalls: ToolCallInfo[];
|
|
76
|
+
/** Results from tool executions */
|
|
77
|
+
toolResults: ToolResultInfo[];
|
|
78
|
+
/** Token usage statistics */
|
|
79
|
+
usage?: ExternalUsage;
|
|
80
|
+
/** Reason the execution finished */
|
|
81
|
+
finishReason: AgentFinishReason;
|
|
82
|
+
/** Provider-specific result metadata */
|
|
83
|
+
metadata?: Record<string, unknown>;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Token usage statistics.
|
|
87
|
+
*/
|
|
88
|
+
interface ExternalUsage {
|
|
89
|
+
inputTokens: number;
|
|
90
|
+
outputTokens: number;
|
|
91
|
+
totalTokens?: number;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Stream chunk from streaming execution.
|
|
95
|
+
*/
|
|
96
|
+
interface ExternalStreamChunk {
|
|
97
|
+
/** Chunk type */
|
|
98
|
+
type: 'text' | 'tool-call' | 'tool-result' | 'step-complete' | 'done';
|
|
99
|
+
/** Text content (for text chunks) */
|
|
100
|
+
text?: string;
|
|
101
|
+
/** Tool call info (for tool-call chunks) */
|
|
102
|
+
toolCall?: ToolCallInfo;
|
|
103
|
+
/** Tool result info (for tool-result chunks) */
|
|
104
|
+
toolResult?: ToolResultInfo;
|
|
105
|
+
/** Step index (for step-complete chunks) */
|
|
106
|
+
stepIndex?: number;
|
|
107
|
+
/** Final result (for done chunks) */
|
|
108
|
+
result?: ExternalExecuteResult;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Set of tools available to an external provider.
|
|
112
|
+
*/
|
|
113
|
+
type ExternalToolSet = Record<string, ExternalToolDefinition>;
|
|
114
|
+
/**
|
|
115
|
+
* External tool definition in a provider-agnostic format.
|
|
116
|
+
*/
|
|
117
|
+
interface ExternalToolDefinition {
|
|
118
|
+
/** Tool name */
|
|
119
|
+
name: string;
|
|
120
|
+
/** Tool description */
|
|
121
|
+
description: string;
|
|
122
|
+
/** Input schema (JSON Schema format) */
|
|
123
|
+
inputSchema: Record<string, unknown>;
|
|
124
|
+
/** Whether tool requires user approval */
|
|
125
|
+
requiresApproval?: boolean;
|
|
126
|
+
/** Tool handler function */
|
|
127
|
+
execute?: (input: unknown) => Promise<unknown>;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Configuration for Claude Agent SDK provider.
|
|
131
|
+
*/
|
|
132
|
+
interface ClaudeAgentSDKConfig {
|
|
133
|
+
/** API key (defaults to ANTHROPIC_API_KEY env var) */
|
|
134
|
+
apiKey?: string;
|
|
135
|
+
/** Model to use (defaults to claude-sonnet-4-20250514) */
|
|
136
|
+
model?: string;
|
|
137
|
+
/** Enable extended thinking mode */
|
|
138
|
+
extendedThinking?: boolean;
|
|
139
|
+
/** Enable computer use capabilities (file editing, bash) */
|
|
140
|
+
computerUse?: boolean;
|
|
141
|
+
/** MCP servers to connect */
|
|
142
|
+
mcpServers?: McpClientConfig[];
|
|
143
|
+
/** Maximum tokens for response */
|
|
144
|
+
maxTokens?: number;
|
|
145
|
+
/** Temperature for generation */
|
|
146
|
+
temperature?: number;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Claude Agent SDK specific context metadata.
|
|
150
|
+
*/
|
|
151
|
+
interface ClaudeAgentContextMetadata {
|
|
152
|
+
/** Session ID for Claude Agent SDK */
|
|
153
|
+
sessionId?: string;
|
|
154
|
+
/** Whether computer use is enabled */
|
|
155
|
+
computerUseEnabled: boolean;
|
|
156
|
+
/** Whether extended thinking is enabled */
|
|
157
|
+
extendedThinkingEnabled: boolean;
|
|
158
|
+
/** Connected MCP servers */
|
|
159
|
+
mcpServerIds?: string[];
|
|
160
|
+
/** Allow additional metadata properties */
|
|
161
|
+
[key: string]: unknown;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Configuration for OpenCode SDK provider.
|
|
165
|
+
*/
|
|
166
|
+
interface OpenCodeSDKConfig {
|
|
167
|
+
/** Server URL (defaults to http://127.0.0.1:4096) */
|
|
168
|
+
serverUrl?: string;
|
|
169
|
+
/** Server port (alternative to full URL) */
|
|
170
|
+
port?: number;
|
|
171
|
+
/** Agent type to use */
|
|
172
|
+
agentType?: OpenCodeAgentType;
|
|
173
|
+
/** Session ID for resuming sessions */
|
|
174
|
+
sessionId?: string;
|
|
175
|
+
/** Model to use */
|
|
176
|
+
model?: string;
|
|
177
|
+
/** Temperature for generation */
|
|
178
|
+
temperature?: number;
|
|
179
|
+
/** Connection timeout in milliseconds */
|
|
180
|
+
timeout?: number;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* OpenCode agent types.
|
|
184
|
+
*/
|
|
185
|
+
type OpenCodeAgentType = 'build' | 'plan' | 'general' | 'explore';
|
|
186
|
+
/**
|
|
187
|
+
* OpenCode SDK specific context metadata.
|
|
188
|
+
*/
|
|
189
|
+
interface OpenCodeContextMetadata {
|
|
190
|
+
/** Session ID from OpenCode */
|
|
191
|
+
sessionId: string;
|
|
192
|
+
/** Agent type being used */
|
|
193
|
+
agentType: OpenCodeAgentType;
|
|
194
|
+
/** Server URL */
|
|
195
|
+
serverUrl: string;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Factory function type for creating providers.
|
|
199
|
+
*/
|
|
200
|
+
type ExternalProviderFactory<TConfig> = (config: TConfig) => ExternalAgentProvider;
|
|
201
|
+
/**
|
|
202
|
+
* Registry of available providers.
|
|
203
|
+
*/
|
|
204
|
+
interface ProviderRegistry {
|
|
205
|
+
/** Get a provider by name */
|
|
206
|
+
get(name: string): ExternalAgentProvider | undefined;
|
|
207
|
+
/** Register a provider */
|
|
208
|
+
register(name: string, provider: ExternalAgentProvider): void;
|
|
209
|
+
/** List available provider names */
|
|
210
|
+
list(): string[];
|
|
211
|
+
/** Check if a provider is registered and available */
|
|
212
|
+
isAvailable(name: string): boolean;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Base error for external provider operations.
|
|
216
|
+
*/
|
|
217
|
+
declare class ExternalProviderError extends Error {
|
|
218
|
+
readonly provider: string;
|
|
219
|
+
readonly code: string;
|
|
220
|
+
readonly cause?: Error | undefined;
|
|
221
|
+
constructor(message: string, provider: string, code: string, cause?: Error | undefined);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Error when provider is not available.
|
|
225
|
+
*/
|
|
226
|
+
declare class ProviderNotAvailableError extends ExternalProviderError {
|
|
227
|
+
constructor(provider: string, reason?: string);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Error when provider execution fails.
|
|
231
|
+
*/
|
|
232
|
+
declare class ProviderExecutionError extends ExternalProviderError {
|
|
233
|
+
constructor(provider: string, message: string, cause?: Error);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Error when context creation fails.
|
|
237
|
+
*/
|
|
238
|
+
declare class ContextCreationError extends ExternalProviderError {
|
|
239
|
+
constructor(provider: string, message: string, cause?: Error);
|
|
240
|
+
}
|
|
241
|
+
//#endregion
|
|
242
|
+
export { ClaudeAgentContextMetadata, ClaudeAgentSDKConfig, ContextCreationError, ExternalAgentContext, ExternalAgentProvider, ExternalExecuteParams, ExternalExecuteResult, ExternalProviderError, ExternalProviderFactory, ExternalStreamChunk, ExternalToolDefinition, ExternalToolSet, ExternalUsage, OpenCodeAgentType, OpenCodeContextMetadata, OpenCodeSDKConfig, ProviderExecutionError, ProviderNotAvailableError, ProviderRegistry };
|
|
243
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/providers/types.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AA0DY,UAjCK,qBAAA,CAiCL;EACO;EAAd,SAAA,IAAA,EAAA,MAAA;EAAa;EAWD,SAAA,OAAA,EAAA,MAAoB;EAI7B;;;;EAMW,WAAA,EAAA,EAAA,OAAA;EAMF;AAgBjB;;;EAQU,aAAA,CAAA,IAAA,EArEY,SAqEZ,CAAA,EArEwB,OAqExB,CArEgC,oBAqEhC,CAAA;EAEM;;;AAQhB;EASiB,OAAA,CAAA,OAAA,EAjFJ,oBAiFuB,EAAA,MAAA,EAhFxB,qBAgFwB,CAAA,EA/E/B,OA+E+B,CA/EvB,qBA+EuB,CAAA;EAMvB;;;;EAYD,MAAA,CAAA,OAAA,EA1FC,oBA0FgC,EAAA,MAAA,EAzFjC,qBAyFwB,CAAA,EAxF/B,aAwF+B,CAxFjB,mBAwFiB,CAAA;AAKpC;AAoBA;AAoBA;AAoBA;AAoBA;AAKiB,UAvKA,oBAAA,CAuKuB;EAgB5B;EAOK,EAAA,EAAA,MAAA;EAkBJ;EAKe,IAAA,EAjNpB,SAiNoB;EAAA;EALe,KAAA,EA1MlC,eA0MkC;EAAK;EAenC,OAAA,EAAA,GAAA,GAvNI,OAuNJ,CAAA,IAAA,CAA0B;EAc1B;EAUA,QAAA,CAAA,EA7OA,MA6OA,CAAA,MAAqB,EAAA,OAAA,CAAA;;;;;UAvOjB,qBAAA;;;;;;YAML;;WAED;;;;;;;UAQM,qBAAA;;;;aAIJ;;eAEE;;UAEL;;gBAEM;;aAEH;;;;;UAMI,aAAA;;;;;;;;UASA,mBAAA;;;;;;aAMJ;;eAEE;;;;WAIJ;;;;;KAMC,eAAA,GAAkB,eAAe;;;;UAK5B,sBAAA;;;;;;eAMF;;;;gCAIiB;;;;;UAUf,oBAAA;;;;;;;;;;eAUF;;;;;;;;;UAUE,0BAAA;;;;;;;;;;;;;;;UAoBA,iBAAA;;;;;;cAMH;;;;;;;;;;;;;KAcF,iBAAA;;;;UAKK,uBAAA;;;;aAIJ;;;;;;;KAYD,4CACF,YACL;;;;UAKY,gBAAA;;qBAEI;;mCAEc;;;;;;;;;cActB,qBAAA,SAA8B,KAAA;;;mBAKf;uEAAA;;;;;cAUf,yBAAA,SAAkC,qBAAA;;;;;;cAclC,sBAAA,SAA+B,qBAAA;yDACa;;;;;cAS5C,oBAAA,SAA6B,qBAAA;yDACe"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
//#region src/providers/types.ts
|
|
2
|
+
/**
|
|
3
|
+
* Base error for external provider operations.
|
|
4
|
+
*/
|
|
5
|
+
var ExternalProviderError = class extends Error {
|
|
6
|
+
constructor(message, provider, code, cause) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.provider = provider;
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.cause = cause;
|
|
11
|
+
this.name = "ExternalProviderError";
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Error when provider is not available.
|
|
16
|
+
*/
|
|
17
|
+
var ProviderNotAvailableError = class extends ExternalProviderError {
|
|
18
|
+
constructor(provider, reason) {
|
|
19
|
+
super(`Provider '${provider}' is not available${reason ? `: ${reason}` : ""}`, provider, "PROVIDER_NOT_AVAILABLE");
|
|
20
|
+
this.name = "ProviderNotAvailableError";
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Error when provider execution fails.
|
|
25
|
+
*/
|
|
26
|
+
var ProviderExecutionError = class extends ExternalProviderError {
|
|
27
|
+
constructor(provider, message, cause) {
|
|
28
|
+
super(message, provider, "EXECUTION_FAILED", cause);
|
|
29
|
+
this.name = "ProviderExecutionError";
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Error when context creation fails.
|
|
34
|
+
*/
|
|
35
|
+
var ContextCreationError = class extends ExternalProviderError {
|
|
36
|
+
constructor(provider, message, cause) {
|
|
37
|
+
super(message, provider, "CONTEXT_CREATION_FAILED", cause);
|
|
38
|
+
this.name = "ContextCreationError";
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
//#endregion
|
|
43
|
+
export { ContextCreationError, ExternalProviderError, ProviderExecutionError, ProviderNotAvailableError };
|
|
44
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","names":["provider: string","code: string","cause?: Error"],"sources":["../../src/providers/types.ts"],"sourcesContent":["/**\n * External SDK provider types for ContractSpec agents.\n *\n * These interfaces define the contract for integrating external agent SDKs\n * (like @anthropic-ai/claude-agent-sdk and @opencode-ai/sdk) with ContractSpec's\n * agent system.\n */\n\nimport type { AgentSpec } from '../spec/spec';\nimport type {\n AgentCallOptions,\n AgentFinishReason,\n ToolCallInfo,\n ToolResultInfo,\n} from '../types';\nimport type { McpClientConfig } from '../tools/mcp-client';\n\n// ============================================================================\n// Core Provider Interface\n// ============================================================================\n\n/**\n * External SDK provider interface for ContractSpec agents.\n * Allows external SDKs to be used as execution backends.\n */\nexport interface ExternalAgentProvider {\n /** Provider name identifier */\n readonly name: string;\n /** Provider version */\n readonly version: string;\n\n /**\n * Check if this provider is available (dependencies installed, configured).\n * Should be a quick synchronous check.\n */\n isAvailable(): boolean;\n\n /**\n * Create an execution context from an AgentSpec.\n * This prepares the provider for execution with the given spec.\n */\n createContext(spec: AgentSpec): Promise<ExternalAgentContext>;\n\n /**\n * Execute a prompt using this provider.\n * Non-streaming execution that returns the complete result.\n */\n execute(\n context: ExternalAgentContext,\n params: ExternalExecuteParams\n ): Promise<ExternalExecuteResult>;\n\n /**\n * Stream execution with real-time updates.\n * Returns an async iterable of stream chunks.\n */\n stream(\n context: ExternalAgentContext,\n params: ExternalExecuteParams\n ): AsyncIterable<ExternalStreamChunk>;\n}\n\n// ============================================================================\n// Context and Execution Types\n// ============================================================================\n\n/**\n * Execution context created by a provider.\n * Holds the prepared state for executing prompts.\n */\nexport interface ExternalAgentContext {\n /** Unique context ID */\n id: string;\n /** The spec this context was created from */\n spec: AgentSpec;\n /** Tools available in this context */\n tools: ExternalToolSet;\n /** Cleanup function to release resources */\n cleanup: () => Promise<void>;\n /** Provider-specific metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Parameters for executing a prompt.\n */\nexport interface ExternalExecuteParams {\n /** The prompt to execute */\n prompt: string;\n /** Optional system prompt override/addition */\n systemOverride?: string;\n /** Call options (tenant, actor, session, metadata) */\n options?: AgentCallOptions;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Maximum steps/iterations (provider may interpret differently) */\n maxSteps?: number;\n}\n\n/**\n * Result from a non-streaming execution.\n */\nexport interface ExternalExecuteResult {\n /** Final text response */\n text: string;\n /** Tool calls made during execution */\n toolCalls: ToolCallInfo[];\n /** Results from tool executions */\n toolResults: ToolResultInfo[];\n /** Token usage statistics */\n usage?: ExternalUsage;\n /** Reason the execution finished */\n finishReason: AgentFinishReason;\n /** Provider-specific result metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Token usage statistics.\n */\nexport interface ExternalUsage {\n inputTokens: number;\n outputTokens: number;\n totalTokens?: number;\n}\n\n/**\n * Stream chunk from streaming execution.\n */\nexport interface ExternalStreamChunk {\n /** Chunk type */\n type: 'text' | 'tool-call' | 'tool-result' | 'step-complete' | 'done';\n /** Text content (for text chunks) */\n text?: string;\n /** Tool call info (for tool-call chunks) */\n toolCall?: ToolCallInfo;\n /** Tool result info (for tool-result chunks) */\n toolResult?: ToolResultInfo;\n /** Step index (for step-complete chunks) */\n stepIndex?: number;\n /** Final result (for done chunks) */\n result?: ExternalExecuteResult;\n}\n\n/**\n * Set of tools available to an external provider.\n */\nexport type ExternalToolSet = Record<string, ExternalToolDefinition>;\n\n/**\n * External tool definition in a provider-agnostic format.\n */\nexport interface ExternalToolDefinition {\n /** Tool name */\n name: string;\n /** Tool description */\n description: string;\n /** Input schema (JSON Schema format) */\n inputSchema: Record<string, unknown>;\n /** Whether tool requires user approval */\n requiresApproval?: boolean;\n /** Tool handler function */\n execute?: (input: unknown) => Promise<unknown>;\n}\n\n// ============================================================================\n// Claude Agent SDK Configuration\n// ============================================================================\n\n/**\n * Configuration for Claude Agent SDK provider.\n */\nexport interface ClaudeAgentSDKConfig {\n /** API key (defaults to ANTHROPIC_API_KEY env var) */\n apiKey?: string;\n /** Model to use (defaults to claude-sonnet-4-20250514) */\n model?: string;\n /** Enable extended thinking mode */\n extendedThinking?: boolean;\n /** Enable computer use capabilities (file editing, bash) */\n computerUse?: boolean;\n /** MCP servers to connect */\n mcpServers?: McpClientConfig[];\n /** Maximum tokens for response */\n maxTokens?: number;\n /** Temperature for generation */\n temperature?: number;\n}\n\n/**\n * Claude Agent SDK specific context metadata.\n */\nexport interface ClaudeAgentContextMetadata {\n /** Session ID for Claude Agent SDK */\n sessionId?: string;\n /** Whether computer use is enabled */\n computerUseEnabled: boolean;\n /** Whether extended thinking is enabled */\n extendedThinkingEnabled: boolean;\n /** Connected MCP servers */\n mcpServerIds?: string[];\n /** Allow additional metadata properties */\n [key: string]: unknown;\n}\n\n// ============================================================================\n// OpenCode SDK Configuration\n// ============================================================================\n\n/**\n * Configuration for OpenCode SDK provider.\n */\nexport interface OpenCodeSDKConfig {\n /** Server URL (defaults to http://127.0.0.1:4096) */\n serverUrl?: string;\n /** Server port (alternative to full URL) */\n port?: number;\n /** Agent type to use */\n agentType?: OpenCodeAgentType;\n /** Session ID for resuming sessions */\n sessionId?: string;\n /** Model to use */\n model?: string;\n /** Temperature for generation */\n temperature?: number;\n /** Connection timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * OpenCode agent types.\n */\nexport type OpenCodeAgentType = 'build' | 'plan' | 'general' | 'explore';\n\n/**\n * OpenCode SDK specific context metadata.\n */\nexport interface OpenCodeContextMetadata {\n /** Session ID from OpenCode */\n sessionId: string;\n /** Agent type being used */\n agentType: OpenCodeAgentType;\n /** Server URL */\n serverUrl: string;\n}\n\n// ============================================================================\n// Provider Factory Types\n// ============================================================================\n\n/**\n * Factory function type for creating providers.\n */\nexport type ExternalProviderFactory<TConfig> = (\n config: TConfig\n) => ExternalAgentProvider;\n\n/**\n * Registry of available providers.\n */\nexport interface ProviderRegistry {\n /** Get a provider by name */\n get(name: string): ExternalAgentProvider | undefined;\n /** Register a provider */\n register(name: string, provider: ExternalAgentProvider): void;\n /** List available provider names */\n list(): string[];\n /** Check if a provider is registered and available */\n isAvailable(name: string): boolean;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/**\n * Base error for external provider operations.\n */\nexport class ExternalProviderError extends Error {\n constructor(\n message: string,\n public readonly provider: string,\n public readonly code: string,\n public readonly cause?: Error\n ) {\n super(message);\n this.name = 'ExternalProviderError';\n }\n}\n\n/**\n * Error when provider is not available.\n */\nexport class ProviderNotAvailableError extends ExternalProviderError {\n constructor(provider: string, reason?: string) {\n super(\n `Provider '${provider}' is not available${reason ? `: ${reason}` : ''}`,\n provider,\n 'PROVIDER_NOT_AVAILABLE'\n );\n this.name = 'ProviderNotAvailableError';\n }\n}\n\n/**\n * Error when provider execution fails.\n */\nexport class ProviderExecutionError extends ExternalProviderError {\n constructor(provider: string, message: string, cause?: Error) {\n super(message, provider, 'EXECUTION_FAILED', cause);\n this.name = 'ProviderExecutionError';\n }\n}\n\n/**\n * Error when context creation fails.\n */\nexport class ContextCreationError extends ExternalProviderError {\n constructor(provider: string, message: string, cause?: Error) {\n super(message, provider, 'CONTEXT_CREATION_FAILED', cause);\n this.name = 'ContextCreationError';\n }\n}\n"],"mappings":";;;;AAsRA,IAAa,wBAAb,cAA2C,MAAM;CAC/C,YACE,SACA,AAAgBA,UAChB,AAAgBC,MAChB,AAAgBC,OAChB;AACA,QAAM,QAAQ;EAJE;EACA;EACA;AAGhB,OAAK,OAAO;;;;;;AAOhB,IAAa,4BAAb,cAA+C,sBAAsB;CACnE,YAAY,UAAkB,QAAiB;AAC7C,QACE,aAAa,SAAS,oBAAoB,SAAS,KAAK,WAAW,MACnE,UACA,yBACD;AACD,OAAK,OAAO;;;;;;AAOhB,IAAa,yBAAb,cAA4C,sBAAsB;CAChE,YAAY,UAAkB,SAAiB,OAAe;AAC5D,QAAM,SAAS,UAAU,oBAAoB,MAAM;AACnD,OAAK,OAAO;;;;;;AAOhB,IAAa,uBAAb,cAA0C,sBAAsB;CAC9D,YAAY,UAAkB,SAAiB,OAAe;AAC5D,QAAM,SAAS,UAAU,2BAA2B,MAAM;AAC1D,OAAK,OAAO"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { McpClientConfig, McpClientResult, createMcpToolsets, mcpServerToTools } from "./mcp-client.js";
|
|
1
2
|
import { buildToolHandlers, createToolHandler, specToolToAISDKTool, specToolsToAISDKTools } from "./tool-adapter.js";
|
|
2
3
|
import { createKnowledgeQueryTool } from "./knowledge-tool.js";
|
|
3
|
-
import { McpClientConfig, McpClientResult, createMcpToolsets, mcpServerToTools } from "./mcp-client.js";
|
|
4
4
|
import { AgentMcpServerConfig, agentToMcpServer, createAgentMcpServer } from "./mcp-server.js";
|
|
5
5
|
export { AgentMcpServerConfig, McpClientConfig, McpClientResult, agentToMcpServer, buildToolHandlers, createAgentMcpServer, createKnowledgeQueryTool, createMcpToolsets, createToolHandler, mcpServerToTools, specToolToAISDKTool, specToolsToAISDKTools };
|
package/dist/types.d.ts
CHANGED
|
@@ -142,5 +142,5 @@ interface AgentStepMetrics {
|
|
|
142
142
|
}
|
|
143
143
|
type AgentEventEmitter = (event: AgentEventName, payload: AgentEventPayload) => void | Promise<void>;
|
|
144
144
|
//#endregion
|
|
145
|
-
export { AgentCallOptions, AgentEventEmitter, AgentEventName, AgentEventPayload, AgentFinishReason, AgentGenerateParams, AgentGenerateResult, AgentMessage, AgentSessionState, AgentStatus, AgentStepMetrics, AgentStreamParams, ToolCallInfo, ToolExecutionContext, ToolHandler, ToolResultInfo };
|
|
145
|
+
export { AgentCallOptions, AgentEventEmitter, AgentEventName, AgentEventPayload, AgentFinishReason, AgentGenerateParams, AgentGenerateResult, AgentMessage, AgentSessionState, AgentStatus, AgentStepMetrics, AgentStreamParams, type LanguageModelUsage, ToolCallInfo, ToolExecutionContext, ToolHandler, ToolResultInfo };
|
|
146
146
|
//# sourceMappingURL=types.d.ts.map
|