@contractspec/lib.ai-agent 1.45.5 → 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.
Files changed (77) hide show
  1. package/dist/_virtual/rolldown_runtime.js +8 -0
  2. package/dist/agent/index.d.ts +2 -2
  3. package/dist/agent/index.js +2 -2
  4. package/dist/agent/unified-agent.d.ts +131 -0
  5. package/dist/agent/unified-agent.d.ts.map +1 -0
  6. package/dist/agent/unified-agent.js +267 -0
  7. package/dist/agent/unified-agent.js.map +1 -0
  8. package/dist/exporters/claude-agent-exporter.d.ts +64 -0
  9. package/dist/exporters/claude-agent-exporter.d.ts.map +1 -0
  10. package/dist/exporters/claude-agent-exporter.js +210 -0
  11. package/dist/exporters/claude-agent-exporter.js.map +1 -0
  12. package/dist/exporters/index.d.ts +4 -0
  13. package/dist/exporters/index.js +4 -0
  14. package/dist/exporters/opencode-exporter.d.ts +64 -0
  15. package/dist/exporters/opencode-exporter.d.ts.map +1 -0
  16. package/dist/exporters/opencode-exporter.js +200 -0
  17. package/dist/exporters/opencode-exporter.js.map +1 -0
  18. package/dist/exporters/types.d.ts +239 -0
  19. package/dist/exporters/types.d.ts.map +1 -0
  20. package/dist/exporters/types.js +0 -0
  21. package/dist/index.d.ts +16 -3
  22. package/dist/index.js +11 -2
  23. package/dist/interop/index.d.ts +4 -0
  24. package/dist/interop/index.js +4 -0
  25. package/dist/interop/spec-consumer.d.ts +81 -0
  26. package/dist/interop/spec-consumer.d.ts.map +1 -0
  27. package/dist/interop/spec-consumer.js +287 -0
  28. package/dist/interop/spec-consumer.js.map +1 -0
  29. package/dist/interop/tool-consumer.d.ts +68 -0
  30. package/dist/interop/tool-consumer.d.ts.map +1 -0
  31. package/dist/interop/tool-consumer.js +220 -0
  32. package/dist/interop/tool-consumer.js.map +1 -0
  33. package/dist/interop/types.d.ts +262 -0
  34. package/dist/interop/types.d.ts.map +1 -0
  35. package/dist/interop/types.js +0 -0
  36. package/dist/providers/claude-agent-sdk/adapter.d.ts +58 -0
  37. package/dist/providers/claude-agent-sdk/adapter.d.ts.map +1 -0
  38. package/dist/providers/claude-agent-sdk/adapter.js +306 -0
  39. package/dist/providers/claude-agent-sdk/adapter.js.map +1 -0
  40. package/dist/providers/claude-agent-sdk/index.d.ts +4 -0
  41. package/dist/providers/claude-agent-sdk/index.js +5 -0
  42. package/dist/providers/claude-agent-sdk/session-bridge.d.ts +101 -0
  43. package/dist/providers/claude-agent-sdk/session-bridge.d.ts.map +1 -0
  44. package/dist/providers/claude-agent-sdk/session-bridge.js +158 -0
  45. package/dist/providers/claude-agent-sdk/session-bridge.js.map +1 -0
  46. package/dist/providers/claude-agent-sdk/tool-bridge.d.ts +110 -0
  47. package/dist/providers/claude-agent-sdk/tool-bridge.d.ts.map +1 -0
  48. package/dist/providers/claude-agent-sdk/tool-bridge.js +122 -0
  49. package/dist/providers/claude-agent-sdk/tool-bridge.js.map +1 -0
  50. package/dist/providers/index.d.ts +7 -0
  51. package/dist/providers/index.js +8 -0
  52. package/dist/providers/opencode-sdk/adapter.d.ts +54 -0
  53. package/dist/providers/opencode-sdk/adapter.d.ts.map +1 -0
  54. package/dist/providers/opencode-sdk/adapter.js +276 -0
  55. package/dist/providers/opencode-sdk/adapter.js.map +1 -0
  56. package/dist/providers/opencode-sdk/agent-bridge.d.ts +94 -0
  57. package/dist/providers/opencode-sdk/agent-bridge.d.ts.map +1 -0
  58. package/dist/providers/opencode-sdk/agent-bridge.js +165 -0
  59. package/dist/providers/opencode-sdk/agent-bridge.js.map +1 -0
  60. package/dist/providers/opencode-sdk/index.d.ts +4 -0
  61. package/dist/providers/opencode-sdk/index.js +5 -0
  62. package/dist/providers/opencode-sdk/tool-bridge.d.ts +81 -0
  63. package/dist/providers/opencode-sdk/tool-bridge.d.ts.map +1 -0
  64. package/dist/providers/opencode-sdk/tool-bridge.js +127 -0
  65. package/dist/providers/opencode-sdk/tool-bridge.js.map +1 -0
  66. package/dist/providers/registry.d.ts +22 -0
  67. package/dist/providers/registry.d.ts.map +1 -0
  68. package/dist/providers/registry.js +52 -0
  69. package/dist/providers/registry.js.map +1 -0
  70. package/dist/providers/types.d.ts +243 -0
  71. package/dist/providers/types.d.ts.map +1 -0
  72. package/dist/providers/types.js +44 -0
  73. package/dist/providers/types.js.map +1 -0
  74. package/dist/tools/index.d.ts +1 -1
  75. package/dist/types.d.ts +1 -1
  76. package/dist/types.d.ts.map +1 -1
  77. package/package.json +37 -5
@@ -0,0 +1,262 @@
1
+ import { AgentSpec, AgentToolConfig } from "../spec/spec.js";
2
+ import { ToolHandler } from "../types.js";
3
+
4
+ //#region src/interop/types.d.ts
5
+
6
+ /**
7
+ * Configuration for a spec consumer.
8
+ */
9
+ interface SpecConsumerConfig {
10
+ /** Specs to consume */
11
+ specs: AgentSpec[];
12
+ /** Whether to include metadata in outputs */
13
+ includeMetadata?: boolean;
14
+ /** Base URL for linking */
15
+ baseUrl?: string;
16
+ }
17
+ /**
18
+ * Options for markdown generation.
19
+ */
20
+ interface SpecMarkdownOptions {
21
+ /** Include table of contents */
22
+ includeToc?: boolean;
23
+ /** Include examples */
24
+ includeExamples?: boolean;
25
+ /** Include tools section */
26
+ includeTools?: boolean;
27
+ /** Include constraints section */
28
+ includeConstraints?: boolean;
29
+ /** Custom header */
30
+ customHeader?: string;
31
+ }
32
+ /**
33
+ * Options for prompt generation.
34
+ */
35
+ interface SpecPromptOptions {
36
+ /** Include tools in prompt */
37
+ includeTools?: boolean;
38
+ /** Include examples in prompt */
39
+ includeExamples?: boolean;
40
+ /** Include constraints in prompt */
41
+ includeConstraints?: boolean;
42
+ /** Output format */
43
+ format?: 'structured' | 'natural';
44
+ /** Custom context to append */
45
+ customContext?: string;
46
+ }
47
+ /**
48
+ * Result from querying a spec.
49
+ */
50
+ interface SpecQueryResult {
51
+ /** Spec key */
52
+ key: string;
53
+ /** The spec itself */
54
+ spec: AgentSpec;
55
+ /** Markdown representation */
56
+ markdown: string;
57
+ /** Prompt representation */
58
+ prompt: string;
59
+ }
60
+ /**
61
+ * Options for listing specs.
62
+ */
63
+ interface SpecListOptions {
64
+ /** Filter by stability */
65
+ stability?: string;
66
+ /** Filter by tags */
67
+ tags?: string[];
68
+ }
69
+ /**
70
+ * Result from listing specs.
71
+ */
72
+ interface SpecListResult {
73
+ /** Spec key */
74
+ key: string;
75
+ /** Spec name (from meta.name or meta.key) */
76
+ name: string;
77
+ /** Spec version */
78
+ version: string;
79
+ /** Description */
80
+ description?: string;
81
+ /** Stability */
82
+ stability?: string;
83
+ /** Tags */
84
+ tags?: string[];
85
+ /** Number of tools */
86
+ toolCount: number;
87
+ }
88
+ /**
89
+ * Interface for spec consumers.
90
+ */
91
+ interface SpecConsumer {
92
+ getSpecMarkdown(specKey: string, options?: SpecMarkdownOptions): string;
93
+ getSpecPrompt(specKey: string, options?: SpecPromptOptions): string;
94
+ listSpecs(options?: SpecListOptions): SpecListResult[];
95
+ querySpec(specKey: string): SpecQueryResult | undefined;
96
+ hasSpec(specKey: string): boolean;
97
+ getSpec(specKey: string): AgentSpec | undefined;
98
+ getAllSpecs(): AgentSpec[];
99
+ getSpecCount(): number;
100
+ addSpec(spec: AgentSpec): void;
101
+ removeSpec(specKey: string): boolean;
102
+ }
103
+ /**
104
+ * Configuration for a tool consumer.
105
+ */
106
+ interface ToolConsumerConfig {
107
+ /** Tools with optional handlers */
108
+ tools: {
109
+ config: AgentToolConfig;
110
+ handler?: ToolHandler;
111
+ }[];
112
+ }
113
+ /**
114
+ * Configuration for a tool server.
115
+ */
116
+ interface ToolServerConfig {
117
+ /** Tools with optional handlers */
118
+ tools: {
119
+ config: AgentToolConfig;
120
+ handler?: ToolHandler;
121
+ }[];
122
+ /** Server name */
123
+ name?: string;
124
+ /** Server version */
125
+ version?: string;
126
+ /** Port to run on */
127
+ port?: number;
128
+ }
129
+ /**
130
+ * Interface for tool servers.
131
+ */
132
+ interface ToolServer {
133
+ start(): Promise<void>;
134
+ stop(): Promise<void>;
135
+ isRunning(): boolean;
136
+ getTools(): AgentToolConfig[];
137
+ }
138
+ /**
139
+ * Format for tool export.
140
+ */
141
+ type ToolExportFormat = 'claude-agent' | 'opencode' | 'mcp' | 'openai';
142
+ /**
143
+ * Interface for tool consumers.
144
+ */
145
+ interface ToolConsumer {
146
+ createToolServer(config?: Partial<ToolServerConfig>): ToolServer;
147
+ exportToolsForSDK(format: ToolExportFormat): unknown[];
148
+ getTools(): AgentToolConfig[];
149
+ getTool(name: string): AgentToolConfig | undefined;
150
+ hasTool(name: string): boolean;
151
+ addTool(config: AgentToolConfig, handler?: ToolHandler): void;
152
+ removeTool(name: string): boolean;
153
+ getToolCount(): number;
154
+ }
155
+ /**
156
+ * Spec list entry for discovery.
157
+ */
158
+ interface SpecListEntry {
159
+ /** Spec key */
160
+ key: string;
161
+ /** Spec version */
162
+ version: string;
163
+ /** Spec type */
164
+ type: 'agent' | 'operation' | 'event' | 'presentation';
165
+ /** Brief description */
166
+ description?: string;
167
+ /** Tags for categorization */
168
+ tags?: string[];
169
+ }
170
+ /**
171
+ * Task type for implementation prompts.
172
+ */
173
+ type ImplementationTaskType = 'implement' | 'test' | 'review' | 'refactor' | 'document';
174
+ /**
175
+ * Options for generating implementation prompts.
176
+ */
177
+ interface ImplementationPromptOptions {
178
+ /** Task type */
179
+ taskType?: ImplementationTaskType;
180
+ /** Target language/framework */
181
+ targetLanguage?: string;
182
+ /** Include examples in prompt */
183
+ includeExamples?: boolean;
184
+ /** Include test scenarios */
185
+ includeTestScenarios?: boolean;
186
+ /** Custom context to append */
187
+ customContext?: string;
188
+ }
189
+ /**
190
+ * Format options for spec export.
191
+ */
192
+ type SpecExportFormat = 'markdown' | 'json' | 'prompt' | 'context';
193
+ /**
194
+ * Tool configuration for external consumption.
195
+ */
196
+ interface ExternalToolConfig {
197
+ /** Tool name */
198
+ name: string;
199
+ /** Tool description */
200
+ description: string;
201
+ /** Input schema */
202
+ inputSchema: Record<string, unknown>;
203
+ /** Whether approval is required */
204
+ requiresApproval: boolean;
205
+ /** Tool category */
206
+ category?: string;
207
+ }
208
+ /**
209
+ * Tool handler with metadata.
210
+ */
211
+ interface ToolWithHandler {
212
+ /** Tool configuration */
213
+ config: AgentToolConfig;
214
+ /** Tool handler function */
215
+ handler: ToolHandler;
216
+ }
217
+ /**
218
+ * Target SDK for tool export.
219
+ */
220
+ type ToolExportTarget = 'claude-agent' | 'opencode' | 'mcp';
221
+ /**
222
+ * MCP server configuration.
223
+ */
224
+ interface McpServerConfig {
225
+ /** Server name */
226
+ name: string;
227
+ /** Server description */
228
+ description?: string;
229
+ /** Server version */
230
+ version?: string;
231
+ /** Tools to expose */
232
+ tools: AgentToolConfig[];
233
+ /** Tool handlers */
234
+ handlers: Map<string, ToolHandler>;
235
+ }
236
+ /**
237
+ * MCP tool definition for server.
238
+ */
239
+ interface McpToolDefinition {
240
+ name: string;
241
+ description: string;
242
+ inputSchema: {
243
+ type: 'object';
244
+ properties?: Record<string, unknown>;
245
+ required?: string[];
246
+ };
247
+ }
248
+ /**
249
+ * Provider type for UnifiedAgent.
250
+ */
251
+ type UnifiedAgentProvider = 'ai-sdk' | 'claude-agent-sdk' | 'opencode-sdk';
252
+ /**
253
+ * Unified agent status.
254
+ */
255
+ type UnifiedAgentStatus = 'idle' | 'initializing' | 'ready' | 'running' | 'completed' | 'failed';
256
+ /**
257
+ * Unified agent execution mode.
258
+ */
259
+ type ExecutionMode = 'generate' | 'stream';
260
+ //#endregion
261
+ export { ExecutionMode, ExternalToolConfig, ImplementationPromptOptions, ImplementationTaskType, McpServerConfig, McpToolDefinition, SpecConsumer, SpecConsumerConfig, SpecExportFormat, SpecListEntry, SpecListOptions, SpecListResult, SpecMarkdownOptions, SpecPromptOptions, SpecQueryResult, ToolConsumer, ToolConsumerConfig, ToolExportFormat, ToolExportTarget, ToolServer, ToolServerConfig, ToolWithHandler, UnifiedAgentProvider, UnifiedAgentStatus };
262
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/interop/types.ts"],"sourcesContent":[],"mappings":";;;;;AA2EA;AAUA;AAoBA;AAC6C,UAzF5B,kBAAA,CAyF4B;EACF;EACrB,KAAA,EAzFb,SAyFa,EAAA;EAAkB;EACV,eAAA,CAAA,EAAA,OAAA;EAEF;EACX,OAAA,CAAA,EAAA,MAAA;;;AAajB;AAWA;AAiBiB,UA5HA,mBAAA,CA4HU;EAChB;EACD,UAAA,CAAA,EAAA,OAAA;EAEI;EAAe,eAAA,CAAA,EAAA,OAAA;EAMjB;EAKK,YAAA,CAAA,EAAY,OAAA;EACO;EAAR,kBAAA,CAAA,EAAA,OAAA;EAA4B;EAC5B,YAAA,CAAA,EAAA,MAAA;;;;;AAI4B,UAjIvC,iBAAA,CAiIuC;EAYvC;EAgBL,YAAA,CAAA,EAAA,OAAA;EAUK;EAgBL,eAAA,CAAA,EAAA,OAAgB;EAKX;EAgBA,kBAAe,CAAA,EAAA,OAAA;EAUpB;EAKK,MAAA,CAAA,EAAA,YAAe,GAAA,SAAA;EAQvB;EAEe,aAAA,CAAA,EAAA,MAAA;;;AAMxB;AAaA;AAQY,UAhPK,eAAA,CAgPa;EAWlB;;;QAvPJ;;;;;;;;;UAUS,eAAA;;;;;;;;;UAUA,cAAA;;;;;;;;;;;;;;;;;;;UAoBA,YAAA;6CAC4B;2CACF;sBACrB,kBAAkB;8BACV;;4BAEF;iBACX;;gBAED;;;;;;UAWC,kBAAA;;;YAGL;cACE;;;;;;UAOG,gBAAA;;;YAGL;cACE;;;;;;;;;;;;UAaG,UAAA;WACN;UACD;;cAEI;;;;;KAMF,gBAAA;;;;UAKK,YAAA;4BACW,QAAQ,oBAAoB;4BAC5B;cACd;yBACW;;kBAEP,2BAA2B;;;;;;;UAY5B,aAAA;;;;;;;;;;;;;;;KAgBL,sBAAA;;;;UAUK,2BAAA;;aAEJ;;;;;;;;;;;;;KAcD,gBAAA;;;;UAKK,kBAAA;;;;;;eAMF;;;;;;;;;UAUE,eAAA;;UAEP;;WAEC;;;;;KAMC,gBAAA;;;;UAKK,eAAA;;;;;;;;SAQR;;YAEG,YAAY;;;;;UAMP,iBAAA;;;;;iBAKA;;;;;;;KAQL,oBAAA;;;;KAQA,kBAAA;;;;KAWA,aAAA"}
File without changes
@@ -0,0 +1,58 @@
1
+ import { AgentSpec } from "../../spec/spec.js";
2
+ import { ClaudeAgentSDKConfig, ExternalAgentContext, ExternalAgentProvider, ExternalExecuteParams, ExternalExecuteResult, ExternalStreamChunk } from "../types.js";
3
+
4
+ //#region src/providers/claude-agent-sdk/adapter.d.ts
5
+
6
+ /**
7
+ * Claude Agent SDK Provider implementation.
8
+ */
9
+ declare class ClaudeAgentSDKProvider implements ExternalAgentProvider {
10
+ readonly name = "claude-agent-sdk";
11
+ readonly version = "1.0.0";
12
+ private config;
13
+ private sdkAvailable;
14
+ constructor(config?: ClaudeAgentSDKConfig);
15
+ /**
16
+ * Check if Claude Agent SDK is available.
17
+ */
18
+ isAvailable(): boolean;
19
+ /**
20
+ * Create an execution context from an AgentSpec.
21
+ */
22
+ createContext(spec: AgentSpec): Promise<ExternalAgentContext>;
23
+ /**
24
+ * Execute a prompt using Claude Agent SDK.
25
+ */
26
+ execute(context: ExternalAgentContext, params: ExternalExecuteParams): Promise<ExternalExecuteResult>;
27
+ /**
28
+ * Stream execution with real-time updates.
29
+ */
30
+ stream(context: ExternalAgentContext, params: ExternalExecuteParams): AsyncIterable<ExternalStreamChunk>;
31
+ /**
32
+ * Load the Claude Agent SDK dynamically.
33
+ */
34
+ private loadSDK;
35
+ /**
36
+ * Prepare tools for Claude Agent SDK format.
37
+ */
38
+ private prepareToolsForSDK;
39
+ /**
40
+ * Execute a single tool.
41
+ */
42
+ private executeTool;
43
+ /**
44
+ * Execute multiple tools.
45
+ */
46
+ private executeTools;
47
+ /**
48
+ * Extract text content from response.
49
+ */
50
+ private extractTextContent;
51
+ /**
52
+ * Map Claude Agent SDK stop reason to ContractSpec finish reason.
53
+ */
54
+ private mapStopReason;
55
+ }
56
+ //#endregion
57
+ export { ClaudeAgentSDKProvider };
58
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","names":[],"sources":["../../../src/providers/claude-agent-sdk/adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAqD+C,cAAlC,sBAAA,YAAkC,qBAAA,CAAA;EAAqB,SAAA,IAAA,GAAA,kBAAA;;;;uBAO9C;;;;;;;;sBAoCM,YAAY,QAAQ;;;;mBAwDnC,8BACD,wBACP,QAAQ;;;;kBAuGA,8BACD,wBACP,cAAc"}
@@ -0,0 +1,306 @@
1
+ import { __require } from "../../_virtual/rolldown_runtime.js";
2
+ import { agentKey } from "../../spec/spec.js";
3
+ import { injectStaticKnowledge } from "../../knowledge/injector.js";
4
+ import { ContextCreationError, ProviderExecutionError, ProviderNotAvailableError } from "../types.js";
5
+ import { extractToolCalls, specToolToExternalTool, specToolsToClaudeAgentTools } from "./tool-bridge.js";
6
+ import { appendAssistantMessage, appendUserMessage, buildClaudeAgentContext, createEmptyClaudeSession } from "./session-bridge.js";
7
+
8
+ //#region src/providers/claude-agent-sdk/adapter.ts
9
+ /**
10
+ * Claude Agent SDK Provider implementation.
11
+ */
12
+ var ClaudeAgentSDKProvider = class {
13
+ name = "claude-agent-sdk";
14
+ version = "1.0.0";
15
+ config;
16
+ sdkAvailable = null;
17
+ constructor(config = {}) {
18
+ this.config = {
19
+ model: "claude-sonnet-4-20250514",
20
+ extendedThinking: false,
21
+ computerUse: false,
22
+ maxTokens: 4096,
23
+ temperature: .7,
24
+ ...config
25
+ };
26
+ }
27
+ /**
28
+ * Check if Claude Agent SDK is available.
29
+ */
30
+ isAvailable() {
31
+ if (this.sdkAvailable !== null) return this.sdkAvailable;
32
+ try {
33
+ __require.resolve("@anthropic-ai/claude-agent-sdk");
34
+ const apiKey = this.config.apiKey ?? process.env.ANTHROPIC_API_KEY;
35
+ this.sdkAvailable = Boolean(apiKey);
36
+ } catch {
37
+ this.sdkAvailable = false;
38
+ }
39
+ return this.sdkAvailable;
40
+ }
41
+ /**
42
+ * Create an execution context from an AgentSpec.
43
+ */
44
+ async createContext(spec) {
45
+ if (!this.isAvailable()) throw new ProviderNotAvailableError(this.name, "SDK not installed or API key not configured");
46
+ try {
47
+ const toolSet = {};
48
+ for (const tool of spec.tools) toolSet[tool.name] = specToolToExternalTool(tool);
49
+ const instructions = await injectStaticKnowledge(spec.instructions, spec.knowledge ?? [], void 0);
50
+ const contextId = `claude-${agentKey(spec.meta)}-${Date.now()}`;
51
+ const metadata = {
52
+ computerUseEnabled: this.config.computerUse ?? false,
53
+ extendedThinkingEnabled: this.config.extendedThinking ?? false,
54
+ mcpServerIds: this.config.mcpServers?.map((s) => s.name) ?? []
55
+ };
56
+ return {
57
+ id: contextId,
58
+ spec: {
59
+ ...spec,
60
+ instructions
61
+ },
62
+ tools: toolSet,
63
+ metadata,
64
+ cleanup: async () => {}
65
+ };
66
+ } catch (error) {
67
+ throw new ContextCreationError(this.name, `Failed to create context: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : void 0);
68
+ }
69
+ }
70
+ /**
71
+ * Execute a prompt using Claude Agent SDK.
72
+ */
73
+ async execute(context, params) {
74
+ try {
75
+ const sdk = await this.loadSDK();
76
+ const systemPrompt = params.systemOverride ? `${context.spec.instructions}\n\n${params.systemOverride}` : context.spec.instructions;
77
+ const claudeContext = buildClaudeAgentContext(params.options);
78
+ let session = createEmptyClaudeSession();
79
+ session = appendUserMessage(session, params.prompt);
80
+ const claudeTools = this.prepareToolsForSDK(context, params);
81
+ const response = await sdk.execute({
82
+ model: this.config.model,
83
+ system: systemPrompt,
84
+ messages: session.messages,
85
+ tools: claudeTools,
86
+ max_tokens: this.config.maxTokens,
87
+ temperature: this.config.temperature,
88
+ metadata: claudeContext,
89
+ extended_thinking: this.config.extendedThinking,
90
+ computer_use: this.config.computerUse
91
+ });
92
+ const toolCalls = extractToolCalls(response);
93
+ const toolResults = await this.executeTools(toolCalls, context, params);
94
+ if (response.content) {
95
+ const content = response.content;
96
+ session = appendAssistantMessage(session, content);
97
+ }
98
+ return {
99
+ text: this.extractTextContent(response),
100
+ toolCalls: toolCalls.map((tc) => ({
101
+ type: "tool-call",
102
+ toolCallId: tc.toolCallId,
103
+ toolName: tc.toolName,
104
+ args: tc.args
105
+ })),
106
+ toolResults: toolResults.map((tr) => ({
107
+ type: "tool-result",
108
+ toolCallId: tr.toolCallId,
109
+ toolName: tr.toolName,
110
+ output: tr.output
111
+ })),
112
+ usage: {
113
+ inputTokens: response.usage?.input_tokens ?? 0,
114
+ outputTokens: response.usage?.output_tokens ?? 0
115
+ },
116
+ finishReason: this.mapStopReason(response.stop_reason),
117
+ metadata: {
118
+ sessionId: context.metadata?.sessionId,
119
+ model: response.model
120
+ }
121
+ };
122
+ } catch (error) {
123
+ throw new ProviderExecutionError(this.name, `Execution failed: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : void 0);
124
+ }
125
+ }
126
+ /**
127
+ * Stream execution with real-time updates.
128
+ */
129
+ async *stream(context, params) {
130
+ try {
131
+ const sdk = await this.loadSDK();
132
+ const systemPrompt = params.systemOverride ? `${context.spec.instructions}\n\n${params.systemOverride}` : context.spec.instructions;
133
+ const claudeContext = buildClaudeAgentContext(params.options);
134
+ const claudeTools = this.prepareToolsForSDK(context, params);
135
+ const stream = await sdk.stream({
136
+ model: this.config.model,
137
+ system: systemPrompt,
138
+ messages: [{
139
+ role: "user",
140
+ content: params.prompt
141
+ }],
142
+ tools: claudeTools,
143
+ max_tokens: this.config.maxTokens,
144
+ temperature: this.config.temperature,
145
+ metadata: claudeContext,
146
+ extended_thinking: this.config.extendedThinking,
147
+ computer_use: this.config.computerUse
148
+ });
149
+ let fullText = "";
150
+ const allToolCalls = [];
151
+ const allToolResults = [];
152
+ let stepIndex = 0;
153
+ for await (const event of stream) {
154
+ if (event.type === "content_block_delta" && event.delta?.type === "text_delta") {
155
+ const text = event.delta.text ?? "";
156
+ fullText += text;
157
+ yield {
158
+ type: "text",
159
+ text
160
+ };
161
+ }
162
+ if (event.type === "content_block_start" && event.content_block?.type === "tool_use") {
163
+ const toolCall = {
164
+ toolCallId: event.content_block.id ?? "",
165
+ toolName: event.content_block.name ?? "",
166
+ args: event.content_block.input
167
+ };
168
+ allToolCalls.push(toolCall);
169
+ yield {
170
+ type: "tool-call",
171
+ toolCall: {
172
+ type: "tool-call",
173
+ ...toolCall
174
+ }
175
+ };
176
+ }
177
+ if (event.type === "message_stop") {
178
+ stepIndex++;
179
+ yield {
180
+ type: "step-complete",
181
+ stepIndex
182
+ };
183
+ }
184
+ }
185
+ for (const toolCall of allToolCalls) {
186
+ const result = await this.executeTool(toolCall, context, params);
187
+ allToolResults.push(result);
188
+ yield {
189
+ type: "tool-result",
190
+ toolResult: {
191
+ type: "tool-result",
192
+ ...result
193
+ }
194
+ };
195
+ }
196
+ yield {
197
+ type: "done",
198
+ result: {
199
+ text: fullText,
200
+ toolCalls: allToolCalls.map((tc) => ({
201
+ type: "tool-call",
202
+ ...tc
203
+ })),
204
+ toolResults: allToolResults.map((tr) => ({
205
+ type: "tool-result",
206
+ ...tr
207
+ })),
208
+ usage: {
209
+ inputTokens: 0,
210
+ outputTokens: 0
211
+ },
212
+ finishReason: "stop"
213
+ }
214
+ };
215
+ } catch (error) {
216
+ throw new ProviderExecutionError(this.name, `Stream failed: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : void 0);
217
+ }
218
+ }
219
+ /**
220
+ * Load the Claude Agent SDK dynamically.
221
+ */
222
+ async loadSDK() {
223
+ try {
224
+ const module = __require("@anthropic-ai/claude-agent-sdk");
225
+ return module.default ?? module;
226
+ } catch {
227
+ throw new ProviderNotAvailableError(this.name, "@anthropic-ai/claude-agent-sdk is not installed");
228
+ }
229
+ }
230
+ /**
231
+ * Prepare tools for Claude Agent SDK format.
232
+ */
233
+ prepareToolsForSDK(context, params) {
234
+ const handlers = /* @__PURE__ */ new Map();
235
+ for (const tool of context.spec.tools) {
236
+ const externalTool = context.tools[tool.name];
237
+ if (externalTool?.execute) handlers.set(tool.name, async (input) => {
238
+ if (!externalTool.execute) throw new Error(`Tool ${tool.name} has no execute handler`);
239
+ const result = await externalTool.execute(input);
240
+ return typeof result === "string" ? result : JSON.stringify(result);
241
+ });
242
+ }
243
+ return specToolsToClaudeAgentTools(context.spec.tools, handlers, {
244
+ agentId: context.id,
245
+ sessionId: params.options?.sessionId,
246
+ tenantId: params.options?.tenantId,
247
+ actorId: params.options?.actorId,
248
+ metadata: params.options?.metadata,
249
+ signal: params.signal
250
+ });
251
+ }
252
+ /**
253
+ * Execute a single tool.
254
+ */
255
+ async executeTool(toolCall, context, _params) {
256
+ const tool = context.tools[toolCall.toolName];
257
+ if (!tool?.execute) return {
258
+ toolCallId: toolCall.toolCallId,
259
+ toolName: toolCall.toolName,
260
+ output: `Error: Tool '${toolCall.toolName}' not found or has no handler`
261
+ };
262
+ try {
263
+ const output = await tool.execute(toolCall.args);
264
+ return {
265
+ toolCallId: toolCall.toolCallId,
266
+ toolName: toolCall.toolName,
267
+ output
268
+ };
269
+ } catch (error) {
270
+ return {
271
+ toolCallId: toolCall.toolCallId,
272
+ toolName: toolCall.toolName,
273
+ output: `Error: ${error instanceof Error ? error.message : String(error)}`
274
+ };
275
+ }
276
+ }
277
+ /**
278
+ * Execute multiple tools.
279
+ */
280
+ async executeTools(toolCalls, context, params) {
281
+ return Promise.all(toolCalls.map((tc) => this.executeTool(tc, context, params)));
282
+ }
283
+ /**
284
+ * Extract text content from response.
285
+ */
286
+ extractTextContent(response) {
287
+ if (!response.content) return "";
288
+ return response.content.filter((block) => typeof block === "object" && block !== null && block.type === "text").map((block) => block.text).join("");
289
+ }
290
+ /**
291
+ * Map Claude Agent SDK stop reason to ContractSpec finish reason.
292
+ */
293
+ mapStopReason(stopReason) {
294
+ switch (stopReason) {
295
+ case "end_turn":
296
+ case "stop_sequence": return "stop";
297
+ case "tool_use": return "tool-calls";
298
+ case "max_tokens": return "length";
299
+ default: return "stop";
300
+ }
301
+ }
302
+ };
303
+
304
+ //#endregion
305
+ export { ClaudeAgentSDKProvider };
306
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","names":["toolSet: ExternalToolSet","metadata: ClaudeAgentContextMetadata","session: ClaudeAgentSessionState","allToolCalls: {\n toolCallId: string;\n toolName: string;\n args: unknown;\n }[]","allToolResults: {\n toolCallId: string;\n toolName: string;\n output: unknown;\n }[]"],"sources":["../../../src/providers/claude-agent-sdk/adapter.ts"],"sourcesContent":["/**\n * Claude Agent SDK Provider\n *\n * Enables ContractSpec agents to leverage Claude's agentic capabilities:\n * - Computer use (file editing, bash execution)\n * - Extended thinking for complex reasoning\n * - Agentic search and subagents\n * - MCP server integration\n *\n * This adapter wraps @anthropic-ai/claude-agent-sdk to work as a backend\n * for ContractSpec agents.\n */\n\nimport type { AgentSpec } from '../../spec/spec';\nimport { agentKey } from '../../spec/spec';\nimport type { ToolHandler } from '../../types';\nimport type {\n ExternalAgentProvider,\n ExternalAgentContext,\n ExternalExecuteParams,\n ExternalExecuteResult,\n ExternalStreamChunk,\n ExternalToolSet,\n ClaudeAgentSDKConfig,\n ClaudeAgentContextMetadata,\n} from '../types';\nimport {\n ContextCreationError,\n ProviderExecutionError,\n ProviderNotAvailableError,\n} from '../types';\nimport {\n specToolsToClaudeAgentTools,\n specToolToExternalTool,\n extractToolCalls,\n} from './tool-bridge';\nimport {\n buildClaudeAgentContext,\n createEmptyClaudeSession,\n appendUserMessage,\n appendAssistantMessage,\n type ClaudeAgentSessionState,\n type ClaudeAgentContentBlock,\n} from './session-bridge';\nimport { injectStaticKnowledge } from '../../knowledge/injector';\n\n// ============================================================================\n// Provider Implementation\n// ============================================================================\n\n/**\n * Claude Agent SDK Provider implementation.\n */\nexport class ClaudeAgentSDKProvider implements ExternalAgentProvider {\n readonly name = 'claude-agent-sdk';\n readonly version = '1.0.0';\n\n private config: ClaudeAgentSDKConfig;\n private sdkAvailable: boolean | null = null;\n\n constructor(config: ClaudeAgentSDKConfig = {}) {\n this.config = {\n model: 'claude-sonnet-4-20250514',\n extendedThinking: false,\n computerUse: false,\n maxTokens: 4096,\n temperature: 0.7,\n ...config,\n };\n }\n\n /**\n * Check if Claude Agent SDK is available.\n */\n isAvailable(): boolean {\n if (this.sdkAvailable !== null) {\n return this.sdkAvailable;\n }\n\n try {\n // Check if the SDK is installed\n require.resolve('@anthropic-ai/claude-agent-sdk');\n\n // Check for API key\n const apiKey = this.config.apiKey ?? process.env.ANTHROPIC_API_KEY;\n this.sdkAvailable = Boolean(apiKey);\n } catch {\n this.sdkAvailable = false;\n }\n\n return this.sdkAvailable;\n }\n\n /**\n * Create an execution context from an AgentSpec.\n */\n async createContext(spec: AgentSpec): Promise<ExternalAgentContext> {\n if (!this.isAvailable()) {\n throw new ProviderNotAvailableError(\n this.name,\n 'SDK not installed or API key not configured'\n );\n }\n\n try {\n // Build tools set\n const toolSet: ExternalToolSet = {};\n for (const tool of spec.tools) {\n toolSet[tool.name] = specToolToExternalTool(tool);\n }\n\n // Inject static knowledge into instructions\n const instructions = await injectStaticKnowledge(\n spec.instructions,\n spec.knowledge ?? [],\n undefined // Knowledge retriever would be passed if available\n );\n\n const contextId = `claude-${agentKey(spec.meta)}-${Date.now()}`;\n\n const metadata: ClaudeAgentContextMetadata = {\n computerUseEnabled: this.config.computerUse ?? false,\n extendedThinkingEnabled: this.config.extendedThinking ?? false,\n mcpServerIds: this.config.mcpServers?.map((s) => s.name) ?? [],\n };\n\n return {\n id: contextId,\n spec: {\n ...spec,\n instructions, // Use knowledge-injected instructions\n },\n tools: toolSet,\n metadata,\n cleanup: async () => {\n // Cleanup MCP connections if any\n // This would be implemented when MCP support is added\n },\n };\n } catch (error) {\n throw new ContextCreationError(\n this.name,\n `Failed to create context: ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Execute a prompt using Claude Agent SDK.\n */\n async execute(\n context: ExternalAgentContext,\n params: ExternalExecuteParams\n ): Promise<ExternalExecuteResult> {\n try {\n // Dynamic import of Claude Agent SDK\n const sdk = await this.loadSDK();\n\n // Build system prompt\n const systemPrompt = params.systemOverride\n ? `${context.spec.instructions}\\n\\n${params.systemOverride}`\n : context.spec.instructions;\n\n // Build Claude Agent SDK context\n const claudeContext = buildClaudeAgentContext(params.options);\n\n // Create session state\n let session: ClaudeAgentSessionState = createEmptyClaudeSession();\n session = appendUserMessage(session, params.prompt);\n\n // Prepare tools for Claude Agent SDK\n const claudeTools = this.prepareToolsForSDK(context, params);\n\n // Execute via SDK\n // Execute via SDK\n const rawResponse = await sdk.execute({\n model: this.config.model,\n system: systemPrompt,\n messages: session.messages,\n tools: claudeTools,\n max_tokens: this.config.maxTokens,\n temperature: this.config.temperature,\n metadata: claudeContext,\n extended_thinking: this.config.extendedThinking,\n computer_use: this.config.computerUse,\n });\n\n // Define expected response shape manually since direct import is tricky with dynamic import\n interface InternalClaudeResponse {\n content?: {\n type: string;\n id?: string;\n name?: string;\n input?: unknown;\n text?: string;\n }[];\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n stop_reason?: string;\n model?: string;\n }\n\n const response = rawResponse as unknown as InternalClaudeResponse;\n\n // Extract tool calls and results\n const toolCalls = extractToolCalls(response);\n const toolResults = await this.executeTools(toolCalls, context, params);\n\n // Update session with assistant response\n if (response.content) {\n // cast content to expected type\n const content =\n response.content as unknown as ClaudeAgentContentBlock[];\n session = appendAssistantMessage(session, content);\n }\n\n return {\n text: this.extractTextContent(response),\n toolCalls: toolCalls.map((tc) => ({\n type: 'tool-call' as const,\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: tc.args,\n })),\n toolResults: toolResults.map((tr) => ({\n type: 'tool-result' as const,\n toolCallId: tr.toolCallId,\n toolName: tr.toolName,\n output: tr.output,\n })),\n usage: {\n inputTokens: response.usage?.input_tokens ?? 0,\n outputTokens: response.usage?.output_tokens ?? 0,\n },\n finishReason: this.mapStopReason(response.stop_reason),\n metadata: {\n sessionId: (context.metadata as ClaudeAgentContextMetadata)\n ?.sessionId,\n model: response.model,\n },\n };\n } catch (error) {\n throw new ProviderExecutionError(\n this.name,\n `Execution failed: ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n /**\n * Stream execution with real-time updates.\n */\n async *stream(\n context: ExternalAgentContext,\n params: ExternalExecuteParams\n ): AsyncIterable<ExternalStreamChunk> {\n try {\n const sdk = await this.loadSDK();\n\n const systemPrompt = params.systemOverride\n ? `${context.spec.instructions}\\n\\n${params.systemOverride}`\n : context.spec.instructions;\n\n const claudeContext = buildClaudeAgentContext(params.options);\n const claudeTools = this.prepareToolsForSDK(context, params);\n\n const stream = await sdk.stream({\n model: this.config.model,\n system: systemPrompt,\n messages: [{ role: 'user', content: params.prompt }],\n tools: claudeTools,\n max_tokens: this.config.maxTokens,\n temperature: this.config.temperature,\n metadata: claudeContext,\n extended_thinking: this.config.extendedThinking,\n computer_use: this.config.computerUse,\n });\n\n let fullText = '';\n const allToolCalls: {\n toolCallId: string;\n toolName: string;\n args: unknown;\n }[] = [];\n const allToolResults: {\n toolCallId: string;\n toolName: string;\n output: unknown;\n }[] = [];\n let stepIndex = 0;\n\n for await (const event of stream) {\n if (\n event.type === 'content_block_delta' &&\n event.delta?.type === 'text_delta'\n ) {\n const text = event.delta.text ?? '';\n fullText += text;\n yield { type: 'text', text };\n }\n\n if (\n event.type === 'content_block_start' &&\n event.content_block?.type === 'tool_use'\n ) {\n const toolCall = {\n toolCallId: event.content_block.id ?? '',\n toolName: event.content_block.name ?? '',\n args: event.content_block.input,\n };\n allToolCalls.push(toolCall);\n yield {\n type: 'tool-call',\n toolCall: {\n type: 'tool-call',\n ...toolCall,\n },\n };\n }\n\n if (event.type === 'message_stop') {\n stepIndex++;\n yield { type: 'step-complete', stepIndex };\n }\n }\n\n // Execute any pending tools\n for (const toolCall of allToolCalls) {\n const result = await this.executeTool(toolCall, context, params);\n allToolResults.push(result);\n yield {\n type: 'tool-result',\n toolResult: {\n type: 'tool-result',\n ...result,\n },\n };\n }\n\n // Final done event\n yield {\n type: 'done',\n result: {\n text: fullText,\n toolCalls: allToolCalls.map((tc) => ({\n type: 'tool-call' as const,\n ...tc,\n })),\n toolResults: allToolResults.map((tr) => ({\n type: 'tool-result' as const,\n ...tr,\n })),\n usage: { inputTokens: 0, outputTokens: 0 }, // Not available in stream\n finishReason: 'stop',\n },\n };\n } catch (error) {\n throw new ProviderExecutionError(\n this.name,\n `Stream failed: ${error instanceof Error ? error.message : String(error)}`,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n /**\n * Load the Claude Agent SDK dynamically.\n */\n private async loadSDK(): Promise<ClaudeAgentSDKInterface> {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const module = require('@anthropic-ai/claude-agent-sdk');\n return module.default ?? module;\n } catch {\n throw new ProviderNotAvailableError(\n this.name,\n '@anthropic-ai/claude-agent-sdk is not installed'\n );\n }\n }\n\n /**\n * Prepare tools for Claude Agent SDK format.\n */\n private prepareToolsForSDK(\n context: ExternalAgentContext,\n params: ExternalExecuteParams\n ): unknown[] {\n const handlers = new Map<string, ToolHandler>();\n\n for (const tool of context.spec.tools) {\n const externalTool = context.tools[tool.name];\n if (externalTool?.execute) {\n handlers.set(tool.name, async (input) => {\n if (!externalTool.execute) {\n throw new Error(`Tool ${tool.name} has no execute handler`);\n }\n const result = await externalTool.execute(input);\n return typeof result === 'string' ? result : JSON.stringify(result);\n });\n }\n }\n\n return specToolsToClaudeAgentTools(context.spec.tools, handlers, {\n agentId: context.id,\n sessionId: params.options?.sessionId,\n tenantId: params.options?.tenantId,\n actorId: params.options?.actorId,\n metadata: params.options?.metadata,\n signal: params.signal,\n });\n }\n\n /**\n * Execute a single tool.\n */\n private async executeTool(\n toolCall: { toolCallId: string; toolName: string; args: unknown },\n context: ExternalAgentContext,\n _params: ExternalExecuteParams\n ): Promise<{ toolCallId: string; toolName: string; output: unknown }> {\n const tool = context.tools[toolCall.toolName];\n if (!tool?.execute) {\n return {\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n output: `Error: Tool '${toolCall.toolName}' not found or has no handler`,\n };\n }\n\n try {\n const output = await tool.execute(toolCall.args);\n return {\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n output,\n };\n } catch (error) {\n return {\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n output: `Error: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n /**\n * Execute multiple tools.\n */\n private async executeTools(\n toolCalls: { toolCallId: string; toolName: string; args: unknown }[],\n context: ExternalAgentContext,\n params: ExternalExecuteParams\n ): Promise<{ toolCallId: string; toolName: string; output: unknown }[]> {\n return Promise.all(\n toolCalls.map((tc) => this.executeTool(tc, context, params))\n );\n }\n\n /**\n * Extract text content from response.\n */\n private extractTextContent(response: { content?: unknown[] }): string {\n if (!response.content) {\n return '';\n }\n\n return response.content\n .filter(\n (block): block is { type: 'text'; text: string } =>\n typeof block === 'object' &&\n block !== null &&\n (block as { type?: string }).type === 'text'\n )\n .map((block) => block.text)\n .join('');\n }\n\n /**\n * Map Claude Agent SDK stop reason to ContractSpec finish reason.\n */\n private mapStopReason(\n stopReason?: string\n ): ExternalExecuteResult['finishReason'] {\n switch (stopReason) {\n case 'end_turn':\n case 'stop_sequence':\n return 'stop';\n case 'tool_use':\n return 'tool-calls';\n case 'max_tokens':\n return 'length';\n default:\n return 'stop';\n }\n }\n}\n\n// ============================================================================\n// SDK Interface Type (for dynamic import)\n// ============================================================================\n\n/**\n * Interface for Claude Agent SDK (used for dynamic import).\n */\ninterface ClaudeAgentSDKInterface {\n execute(options: {\n model?: string;\n system?: string;\n messages: unknown[];\n tools?: unknown[];\n max_tokens?: number;\n temperature?: number;\n metadata?: Record<string, unknown>;\n extended_thinking?: boolean;\n computer_use?: boolean;\n }): Promise<{\n content?: unknown[];\n usage?: { input_tokens?: number; output_tokens?: number };\n stop_reason?: string;\n model?: string;\n }>;\n\n stream(options: {\n model?: string;\n system?: string;\n messages: unknown[];\n tools?: unknown[];\n max_tokens?: number;\n temperature?: number;\n metadata?: Record<string, unknown>;\n extended_thinking?: boolean;\n computer_use?: boolean;\n }): AsyncIterable<{\n type: string;\n delta?: { type?: string; text?: string };\n content_block?: {\n type?: string;\n id?: string;\n name?: string;\n input?: unknown;\n };\n }>;\n}\n"],"mappings":"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"}