@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.
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,4 @@
1
+ import { ClaudeAgentSDKProvider } from "./adapter.js";
2
+ import { ClaudeAgentTool, ClaudeAgentToolResult, ClaudeAgentToolResultContent, claudeAgentToolToSpecTool, claudeAgentToolsToSpecTools, extractToolCalls, specToolToClaudeAgentTool, specToolToExternalTool, specToolsToClaudeAgentTools } from "./tool-bridge.js";
3
+ import { ClaudeAgentContentBlock, ClaudeAgentMessage, ClaudeAgentSession, ClaudeAgentSessionState, appendAssistantMessage, appendUserMessage, buildClaudeAgentContext, clearSession, createClaudeAgentSession, createEmptyClaudeSession, createToolResultBlock, estimateTokens, extractToolUseBlocks, getMessageCount, getRecentMessages, summarizeSession, toClaudeAgentSession, updateSessionMetadata } from "./session-bridge.js";
4
+ export { ClaudeAgentContentBlock, ClaudeAgentMessage, ClaudeAgentSDKProvider, ClaudeAgentSession, ClaudeAgentSessionState, ClaudeAgentTool, ClaudeAgentToolResult, ClaudeAgentToolResultContent, appendAssistantMessage, appendUserMessage, buildClaudeAgentContext, claudeAgentToolToSpecTool, claudeAgentToolsToSpecTools, clearSession, createClaudeAgentSession, createEmptyClaudeSession, createToolResultBlock, estimateTokens, extractToolCalls, extractToolUseBlocks, getMessageCount, getRecentMessages, specToolToClaudeAgentTool, specToolToExternalTool, specToolsToClaudeAgentTools, summarizeSession, toClaudeAgentSession, updateSessionMetadata };
@@ -0,0 +1,5 @@
1
+ import { claudeAgentToolToSpecTool, claudeAgentToolsToSpecTools, extractToolCalls, specToolToClaudeAgentTool, specToolToExternalTool, specToolsToClaudeAgentTools } from "./tool-bridge.js";
2
+ import { appendAssistantMessage, appendUserMessage, buildClaudeAgentContext, clearSession, createClaudeAgentSession, createEmptyClaudeSession, createToolResultBlock, estimateTokens, extractToolUseBlocks, getMessageCount, getRecentMessages, summarizeSession, toClaudeAgentSession, updateSessionMetadata } from "./session-bridge.js";
3
+ import { ClaudeAgentSDKProvider } from "./adapter.js";
4
+
5
+ export { ClaudeAgentSDKProvider, appendAssistantMessage, appendUserMessage, buildClaudeAgentContext, claudeAgentToolToSpecTool, claudeAgentToolsToSpecTools, clearSession, createClaudeAgentSession, createEmptyClaudeSession, createToolResultBlock, estimateTokens, extractToolCalls, extractToolUseBlocks, getMessageCount, getRecentMessages, specToolToClaudeAgentTool, specToolToExternalTool, specToolsToClaudeAgentTools, summarizeSession, toClaudeAgentSession, updateSessionMetadata };
@@ -0,0 +1,101 @@
1
+ import { AgentCallOptions, AgentSessionState } from "../../types.js";
2
+
3
+ //#region src/providers/claude-agent-sdk/session-bridge.d.ts
4
+
5
+ /**
6
+ * Claude Agent SDK content block (text or tool use).
7
+ */
8
+ interface ClaudeAgentContentBlock {
9
+ type: 'text' | 'tool_use' | 'tool_result';
10
+ text?: string;
11
+ id?: string;
12
+ name?: string;
13
+ input?: unknown;
14
+ tool_use_id?: string;
15
+ content?: string | ClaudeAgentContentBlock[];
16
+ is_error?: boolean;
17
+ }
18
+ /**
19
+ * Claude Agent SDK message format.
20
+ */
21
+ interface ClaudeAgentMessage {
22
+ role: 'user' | 'assistant';
23
+ content: string | ClaudeAgentContentBlock[];
24
+ }
25
+ /**
26
+ * Claude Agent SDK session state.
27
+ */
28
+ interface ClaudeAgentSession {
29
+ sessionId?: string;
30
+ messages: ClaudeAgentMessage[];
31
+ metadata?: Record<string, unknown>;
32
+ }
33
+ /**
34
+ * Claude Agent SDK session state (alias).
35
+ */
36
+ type ClaudeAgentSessionState = ClaudeAgentSession;
37
+ /**
38
+ * Convert ContractSpec session to Claude Agent SDK session.
39
+ */
40
+ declare function toClaudeAgentSession(state: AgentSessionState): ClaudeAgentSession;
41
+ /**
42
+ * Create a new Claude Agent session from call options.
43
+ */
44
+ declare function createClaudeAgentSession(options?: AgentCallOptions): ClaudeAgentSession;
45
+ /**
46
+ * Create an empty Claude Agent session.
47
+ */
48
+ declare function createEmptyClaudeSession(): ClaudeAgentSession;
49
+ /**
50
+ * Build Claude Agent context metadata from call options.
51
+ */
52
+ declare function buildClaudeAgentContext(options?: AgentCallOptions): Record<string, unknown>;
53
+ /**
54
+ * Append a user message to the session.
55
+ */
56
+ declare function appendUserMessage(session: ClaudeAgentSession, content: string): ClaudeAgentSession;
57
+ /**
58
+ * Append an assistant message to the session.
59
+ */
60
+ declare function appendAssistantMessage(session: ClaudeAgentSession, content: string | ClaudeAgentContentBlock[]): ClaudeAgentSession;
61
+ /**
62
+ * Clear the session history.
63
+ */
64
+ declare function clearSession(session: ClaudeAgentSession): ClaudeAgentSession;
65
+ /**
66
+ * Get the last N messages from the session.
67
+ */
68
+ declare function getRecentMessages(session: ClaudeAgentSession, count: number): ClaudeAgentMessage[];
69
+ /**
70
+ * Extract tool calls from a message content.
71
+ */
72
+ declare function extractToolUseBlocks(content: string | ClaudeAgentContentBlock[]): ClaudeAgentContentBlock[];
73
+ /**
74
+ * Create a tool result block.
75
+ */
76
+ declare function createToolResultBlock(toolUseId: string, result: unknown, isError?: boolean): ClaudeAgentContentBlock;
77
+ /**
78
+ * Update session metadata.
79
+ */
80
+ declare function updateSessionMetadata(session: ClaudeAgentSession, metadata: Record<string, unknown>): ClaudeAgentSession;
81
+ /**
82
+ * Get session message count.
83
+ */
84
+ declare function getMessageCount(session: ClaudeAgentSession): number;
85
+ /**
86
+ * Get the total token estimate for the session.
87
+ * This is a rough estimate based on character count.
88
+ */
89
+ declare function estimateTokens(session: ClaudeAgentSession): number;
90
+ /**
91
+ * Summarize the session for logging.
92
+ */
93
+ declare function summarizeSession(session: ClaudeAgentSession): {
94
+ messageCount: number;
95
+ userMessages: number;
96
+ assistantMessages: number;
97
+ estimatedTokens: number;
98
+ };
99
+ //#endregion
100
+ export { ClaudeAgentContentBlock, ClaudeAgentMessage, ClaudeAgentSession, ClaudeAgentSessionState, appendAssistantMessage, appendUserMessage, buildClaudeAgentContext, clearSession, createClaudeAgentSession, createEmptyClaudeSession, createToolResultBlock, estimateTokens, extractToolUseBlocks, getMessageCount, getRecentMessages, summarizeSession, toClaudeAgentSession, updateSessionMetadata };
101
+ //# sourceMappingURL=session-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-bridge.d.ts","names":[],"sources":["../../../src/providers/claude-agent-sdk/session-bridge.ts"],"sourcesContent":[],"mappings":";;;;AAwFA;AAiBA;AAOA;AAcgB,UA9GC,uBAAA,CA+GN;EAYK,IAAA,EAAA,MAAA,GAAA,UAAsB,GAAA,aAAA;EAC3B,IAAA,CAAA,EAAA,MAAA;EACS,EAAA,CAAA,EAAA,MAAA;EACjB,IAAA,CAAA,EAAA,MAAA;EAAkB,KAAA,CAAA,EAAA,OAAA;EAUL,WAAA,CAAA,EAAA,MAAY;EAUZ,OAAA,CAAA,EAAA,MAAA,GA3IK,uBA4IV,EAAA;EASK,QAAA,CAAA,EAAA,OAAA;AAYhB;AAoBA;;;AAGG,UAjLc,kBAAA,CAiLd;EAAkB,IAAA,EAAA,MAAA,GAAA,WAAA;EAaL,OAAA,EAAA,MAAA,GA5LI,uBA4LqB,EAAA;AAQzC;AAgBA;;;UA9MiB,kBAAA;;YAEL;aACC;;;;;KAUD,uBAAA,GAA0B;;;;iBAKtB,oBAAA,QACP,oBACN;;;;iBA8Ba,wBAAA,WACJ,mBACT;;;;iBAea,wBAAA,CAAA,GAA4B;;;;iBAO5B,uBAAA,WACJ,mBACT;;;;iBAYa,iBAAA,UACL,sCAER;;;;iBAUa,sBAAA,UACL,sCACS,4BACjB;;;;iBAUa,YAAA,UAAsB,qBAAqB;;;;iBAU3C,iBAAA,UACL,oCAER;;;;iBAOa,oBAAA,mBACI,4BACjB;;;;iBAUa,qBAAA,yDAIb;;;;iBAgBa,qBAAA,UACL,8BACC,0BACT;;;;iBAaa,eAAA,UAAyB;;;;;iBAQzB,cAAA,UAAwB;;;;iBAgBxB,gBAAA,UAA0B"}
@@ -0,0 +1,158 @@
1
+ //#region src/providers/claude-agent-sdk/session-bridge.ts
2
+ /**
3
+ * Convert ContractSpec session to Claude Agent SDK session.
4
+ */
5
+ function toClaudeAgentSession(state) {
6
+ const messages = [];
7
+ for (const msg of state.messages) if (msg.role === "user" || msg.role === "assistant") {
8
+ const content = typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content);
9
+ messages.push({
10
+ role: msg.role,
11
+ content
12
+ });
13
+ }
14
+ return {
15
+ sessionId: state.sessionId,
16
+ messages,
17
+ metadata: {
18
+ agentId: state.agentId,
19
+ tenantId: state.tenantId,
20
+ actorId: state.actorId
21
+ }
22
+ };
23
+ }
24
+ /**
25
+ * Create a new Claude Agent session from call options.
26
+ */
27
+ function createClaudeAgentSession(options) {
28
+ return {
29
+ sessionId: options?.sessionId,
30
+ messages: [],
31
+ metadata: {
32
+ tenantId: options?.tenantId,
33
+ actorId: options?.actorId,
34
+ ...options?.metadata
35
+ }
36
+ };
37
+ }
38
+ /**
39
+ * Create an empty Claude Agent session.
40
+ */
41
+ function createEmptyClaudeSession() {
42
+ return createClaudeAgentSession();
43
+ }
44
+ /**
45
+ * Build Claude Agent context metadata from call options.
46
+ */
47
+ function buildClaudeAgentContext(options) {
48
+ return {
49
+ tenantId: options?.tenantId,
50
+ actorId: options?.actorId,
51
+ sessionId: options?.sessionId,
52
+ ...options?.metadata
53
+ };
54
+ }
55
+ /**
56
+ * Append a user message to the session.
57
+ */
58
+ function appendUserMessage(session, content) {
59
+ return {
60
+ ...session,
61
+ messages: [...session.messages, {
62
+ role: "user",
63
+ content
64
+ }]
65
+ };
66
+ }
67
+ /**
68
+ * Append an assistant message to the session.
69
+ */
70
+ function appendAssistantMessage(session, content) {
71
+ return {
72
+ ...session,
73
+ messages: [...session.messages, {
74
+ role: "assistant",
75
+ content
76
+ }]
77
+ };
78
+ }
79
+ /**
80
+ * Clear the session history.
81
+ */
82
+ function clearSession(session) {
83
+ return {
84
+ ...session,
85
+ messages: []
86
+ };
87
+ }
88
+ /**
89
+ * Get the last N messages from the session.
90
+ */
91
+ function getRecentMessages(session, count) {
92
+ return session.messages.slice(-count);
93
+ }
94
+ /**
95
+ * Extract tool calls from a message content.
96
+ */
97
+ function extractToolUseBlocks(content) {
98
+ if (typeof content === "string") return [];
99
+ return content.filter((block) => block.type === "tool_use");
100
+ }
101
+ /**
102
+ * Create a tool result block.
103
+ */
104
+ function createToolResultBlock(toolUseId, result, isError = false) {
105
+ return {
106
+ type: "tool_result",
107
+ tool_use_id: toolUseId,
108
+ content: typeof result === "string" ? result : JSON.stringify(result),
109
+ is_error: isError
110
+ };
111
+ }
112
+ /**
113
+ * Update session metadata.
114
+ */
115
+ function updateSessionMetadata(session, metadata) {
116
+ return {
117
+ ...session,
118
+ metadata: {
119
+ ...session.metadata,
120
+ ...metadata
121
+ }
122
+ };
123
+ }
124
+ /**
125
+ * Get session message count.
126
+ */
127
+ function getMessageCount(session) {
128
+ return session.messages.length;
129
+ }
130
+ /**
131
+ * Get the total token estimate for the session.
132
+ * This is a rough estimate based on character count.
133
+ */
134
+ function estimateTokens(session) {
135
+ let chars = 0;
136
+ for (const msg of session.messages) if (typeof msg.content === "string") chars += msg.content.length;
137
+ else chars += JSON.stringify(msg.content).length;
138
+ return Math.ceil(chars / 4);
139
+ }
140
+ /**
141
+ * Summarize the session for logging.
142
+ */
143
+ function summarizeSession(session) {
144
+ let userMessages = 0;
145
+ let assistantMessages = 0;
146
+ for (const msg of session.messages) if (msg.role === "user") userMessages++;
147
+ else assistantMessages++;
148
+ return {
149
+ messageCount: session.messages.length,
150
+ userMessages,
151
+ assistantMessages,
152
+ estimatedTokens: estimateTokens(session)
153
+ };
154
+ }
155
+
156
+ //#endregion
157
+ export { appendAssistantMessage, appendUserMessage, buildClaudeAgentContext, clearSession, createClaudeAgentSession, createEmptyClaudeSession, createToolResultBlock, estimateTokens, extractToolUseBlocks, getMessageCount, getRecentMessages, summarizeSession, toClaudeAgentSession, updateSessionMetadata };
158
+ //# sourceMappingURL=session-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-bridge.js","names":["messages: ClaudeAgentMessage[]"],"sources":["../../../src/providers/claude-agent-sdk/session-bridge.ts"],"sourcesContent":["/**\n * Session bridge for mapping between ContractSpec and Claude Agent SDK sessions.\n *\n * Handles session state synchronization, message history conversion,\n * and context preservation across the two systems.\n */\nimport type { AgentSessionState } from '../../types';\nimport type { AgentCallOptions } from '../../types';\n\n// =============================================================================\n// Claude Agent SDK Session Types\n// =============================================================================\n\n/**\n * Claude Agent SDK content block (text or tool use).\n */\nexport interface ClaudeAgentContentBlock {\n type: 'text' | 'tool_use' | 'tool_result';\n text?: string;\n id?: string;\n name?: string;\n input?: unknown;\n tool_use_id?: string;\n content?: string | ClaudeAgentContentBlock[];\n is_error?: boolean;\n}\n\n/**\n * Claude Agent SDK message format.\n */\nexport interface ClaudeAgentMessage {\n role: 'user' | 'assistant';\n content: string | ClaudeAgentContentBlock[];\n}\n\n/**\n * Claude Agent SDK session state.\n */\nexport interface ClaudeAgentSession {\n sessionId?: string;\n messages: ClaudeAgentMessage[];\n metadata?: Record<string, unknown>;\n}\n\n// =============================================================================\n// Session Conversion\n// =============================================================================\n\n/**\n * Claude Agent SDK session state (alias).\n */\nexport type ClaudeAgentSessionState = ClaudeAgentSession;\n\n/**\n * Convert ContractSpec session to Claude Agent SDK session.\n */\nexport function toClaudeAgentSession(\n state: AgentSessionState\n): ClaudeAgentSession {\n const messages: ClaudeAgentMessage[] = [];\n\n for (const msg of state.messages) {\n if (msg.role === 'user' || msg.role === 'assistant') {\n const content =\n typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n messages.push({\n role: msg.role,\n content,\n });\n }\n }\n\n return {\n sessionId: state.sessionId,\n messages,\n metadata: {\n agentId: state.agentId,\n tenantId: state.tenantId,\n actorId: state.actorId,\n },\n };\n}\n\n/**\n * Create a new Claude Agent session from call options.\n */\nexport function createClaudeAgentSession(\n options?: AgentCallOptions\n): ClaudeAgentSession {\n return {\n sessionId: options?.sessionId,\n messages: [],\n metadata: {\n tenantId: options?.tenantId,\n actorId: options?.actorId,\n ...options?.metadata,\n },\n };\n}\n\n/**\n * Create an empty Claude Agent session.\n */\nexport function createEmptyClaudeSession(): ClaudeAgentSession {\n return createClaudeAgentSession();\n}\n\n/**\n * Build Claude Agent context metadata from call options.\n */\nexport function buildClaudeAgentContext(\n options?: AgentCallOptions\n): Record<string, unknown> {\n return {\n tenantId: options?.tenantId,\n actorId: options?.actorId,\n sessionId: options?.sessionId,\n ...options?.metadata,\n };\n}\n\n/**\n * Append a user message to the session.\n */\nexport function appendUserMessage(\n session: ClaudeAgentSession,\n content: string\n): ClaudeAgentSession {\n return {\n ...session,\n messages: [...session.messages, { role: 'user', content }],\n };\n}\n\n/**\n * Append an assistant message to the session.\n */\nexport function appendAssistantMessage(\n session: ClaudeAgentSession,\n content: string | ClaudeAgentContentBlock[]\n): ClaudeAgentSession {\n return {\n ...session,\n messages: [...session.messages, { role: 'assistant', content }],\n };\n}\n\n/**\n * Clear the session history.\n */\nexport function clearSession(session: ClaudeAgentSession): ClaudeAgentSession {\n return {\n ...session,\n messages: [],\n };\n}\n\n/**\n * Get the last N messages from the session.\n */\nexport function getRecentMessages(\n session: ClaudeAgentSession,\n count: number\n): ClaudeAgentMessage[] {\n return session.messages.slice(-count);\n}\n\n/**\n * Extract tool calls from a message content.\n */\nexport function extractToolUseBlocks(\n content: string | ClaudeAgentContentBlock[]\n): ClaudeAgentContentBlock[] {\n if (typeof content === 'string') {\n return [];\n }\n return content.filter((block) => block.type === 'tool_use');\n}\n\n/**\n * Create a tool result block.\n */\nexport function createToolResultBlock(\n toolUseId: string,\n result: unknown,\n isError = false\n): ClaudeAgentContentBlock {\n return {\n type: 'tool_result',\n tool_use_id: toolUseId,\n content: typeof result === 'string' ? result : JSON.stringify(result),\n is_error: isError,\n };\n}\n\n// =============================================================================\n// Session Metadata\n// =============================================================================\n\n/**\n * Update session metadata.\n */\nexport function updateSessionMetadata(\n session: ClaudeAgentSession,\n metadata: Record<string, unknown>\n): ClaudeAgentSession {\n return {\n ...session,\n metadata: {\n ...session.metadata,\n ...metadata,\n },\n };\n}\n\n/**\n * Get session message count.\n */\nexport function getMessageCount(session: ClaudeAgentSession): number {\n return session.messages.length;\n}\n\n/**\n * Get the total token estimate for the session.\n * This is a rough estimate based on character count.\n */\nexport function estimateTokens(session: ClaudeAgentSession): number {\n let chars = 0;\n for (const msg of session.messages) {\n if (typeof msg.content === 'string') {\n chars += msg.content.length;\n } else {\n chars += JSON.stringify(msg.content).length;\n }\n }\n // Rough estimate: ~4 chars per token\n return Math.ceil(chars / 4);\n}\n\n/**\n * Summarize the session for logging.\n */\nexport function summarizeSession(session: ClaudeAgentSession): {\n messageCount: number;\n userMessages: number;\n assistantMessages: number;\n estimatedTokens: number;\n} {\n let userMessages = 0;\n let assistantMessages = 0;\n\n for (const msg of session.messages) {\n if (msg.role === 'user') {\n userMessages++;\n } else {\n assistantMessages++;\n }\n }\n\n return {\n messageCount: session.messages.length,\n userMessages,\n assistantMessages,\n estimatedTokens: estimateTokens(session),\n };\n}\n"],"mappings":";;;;AAwDA,SAAgB,qBACd,OACoB;CACpB,MAAMA,WAAiC,EAAE;AAEzC,MAAK,MAAM,OAAO,MAAM,SACtB,KAAI,IAAI,SAAS,UAAU,IAAI,SAAS,aAAa;EACnD,MAAM,UACJ,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,KAAK,UAAU,IAAI,QAAQ;AACjC,WAAS,KAAK;GACZ,MAAM,IAAI;GACV;GACD,CAAC;;AAIN,QAAO;EACL,WAAW,MAAM;EACjB;EACA,UAAU;GACR,SAAS,MAAM;GACf,UAAU,MAAM;GAChB,SAAS,MAAM;GAChB;EACF;;;;;AAMH,SAAgB,yBACd,SACoB;AACpB,QAAO;EACL,WAAW,SAAS;EACpB,UAAU,EAAE;EACZ,UAAU;GACR,UAAU,SAAS;GACnB,SAAS,SAAS;GAClB,GAAG,SAAS;GACb;EACF;;;;;AAMH,SAAgB,2BAA+C;AAC7D,QAAO,0BAA0B;;;;;AAMnC,SAAgB,wBACd,SACyB;AACzB,QAAO;EACL,UAAU,SAAS;EACnB,SAAS,SAAS;EAClB,WAAW,SAAS;EACpB,GAAG,SAAS;EACb;;;;;AAMH,SAAgB,kBACd,SACA,SACoB;AACpB,QAAO;EACL,GAAG;EACH,UAAU,CAAC,GAAG,QAAQ,UAAU;GAAE,MAAM;GAAQ;GAAS,CAAC;EAC3D;;;;;AAMH,SAAgB,uBACd,SACA,SACoB;AACpB,QAAO;EACL,GAAG;EACH,UAAU,CAAC,GAAG,QAAQ,UAAU;GAAE,MAAM;GAAa;GAAS,CAAC;EAChE;;;;;AAMH,SAAgB,aAAa,SAAiD;AAC5E,QAAO;EACL,GAAG;EACH,UAAU,EAAE;EACb;;;;;AAMH,SAAgB,kBACd,SACA,OACsB;AACtB,QAAO,QAAQ,SAAS,MAAM,CAAC,MAAM;;;;;AAMvC,SAAgB,qBACd,SAC2B;AAC3B,KAAI,OAAO,YAAY,SACrB,QAAO,EAAE;AAEX,QAAO,QAAQ,QAAQ,UAAU,MAAM,SAAS,WAAW;;;;;AAM7D,SAAgB,sBACd,WACA,QACA,UAAU,OACe;AACzB,QAAO;EACL,MAAM;EACN,aAAa;EACb,SAAS,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,OAAO;EACrE,UAAU;EACX;;;;;AAUH,SAAgB,sBACd,SACA,UACoB;AACpB,QAAO;EACL,GAAG;EACH,UAAU;GACR,GAAG,QAAQ;GACX,GAAG;GACJ;EACF;;;;;AAMH,SAAgB,gBAAgB,SAAqC;AACnE,QAAO,QAAQ,SAAS;;;;;;AAO1B,SAAgB,eAAe,SAAqC;CAClE,IAAI,QAAQ;AACZ,MAAK,MAAM,OAAO,QAAQ,SACxB,KAAI,OAAO,IAAI,YAAY,SACzB,UAAS,IAAI,QAAQ;KAErB,UAAS,KAAK,UAAU,IAAI,QAAQ,CAAC;AAIzC,QAAO,KAAK,KAAK,QAAQ,EAAE;;;;;AAM7B,SAAgB,iBAAiB,SAK/B;CACA,IAAI,eAAe;CACnB,IAAI,oBAAoB;AAExB,MAAK,MAAM,OAAO,QAAQ,SACxB,KAAI,IAAI,SAAS,OACf;KAEA;AAIJ,QAAO;EACL,cAAc,QAAQ,SAAS;EAC/B;EACA;EACA,iBAAiB,eAAe,QAAQ;EACzC"}
@@ -0,0 +1,110 @@
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/claude-agent-sdk/tool-bridge.d.ts
6
+
7
+ /**
8
+ * Claude Agent SDK tool definition.
9
+ * Based on Anthropic's tool format.
10
+ */
11
+ interface ClaudeAgentTool {
12
+ /** Tool name */
13
+ name: string;
14
+ /** Tool description */
15
+ description: string;
16
+ /** Input schema in JSON Schema format */
17
+ input_schema: {
18
+ type: 'object';
19
+ properties?: Record<string, unknown>;
20
+ required?: string[];
21
+ additionalProperties?: boolean;
22
+ };
23
+ /** Whether tool requires confirmation before execution */
24
+ requires_confirmation?: boolean;
25
+ /** Tool category for organization */
26
+ category?: string;
27
+ }
28
+ /**
29
+ * Claude Agent SDK tool result.
30
+ */
31
+ interface ClaudeAgentToolResult {
32
+ /** Tool call ID this result corresponds to */
33
+ tool_use_id: string;
34
+ /** Result content */
35
+ content: string | ClaudeAgentToolResultContent[];
36
+ /** Whether the tool execution failed */
37
+ is_error?: boolean;
38
+ }
39
+ /**
40
+ * Claude Agent SDK tool result content block.
41
+ */
42
+ interface ClaudeAgentToolResultContent {
43
+ type: 'text' | 'image';
44
+ text?: string;
45
+ source?: {
46
+ type: 'base64';
47
+ media_type: string;
48
+ data: string;
49
+ };
50
+ }
51
+ /**
52
+ * Convert a ContractSpec AgentToolConfig to Claude Agent SDK tool format.
53
+ *
54
+ * @param tool - ContractSpec tool configuration
55
+ * @param handler - Tool handler function
56
+ * @param context - Partial execution context to inject
57
+ * @returns Claude Agent SDK tool definition with execute function
58
+ */
59
+ declare function specToolToClaudeAgentTool(tool: AgentToolConfig, handler: ToolHandler, context: Partial<ToolExecutionContext>): ClaudeAgentTool & {
60
+ execute: (input: unknown) => Promise<unknown>;
61
+ };
62
+ /**
63
+ * Convert multiple ContractSpec tools to Claude Agent SDK format.
64
+ */
65
+ declare function specToolsToClaudeAgentTools(tools: AgentToolConfig[], handlers: Map<string, ToolHandler>, context: Partial<ToolExecutionContext>): (ClaudeAgentTool & {
66
+ execute: (input: unknown) => Promise<unknown>;
67
+ })[];
68
+ /**
69
+ * Convert a Claude Agent SDK tool to ContractSpec AgentToolConfig.
70
+ * This enables importing tools defined in Claude Agent SDK format.
71
+ *
72
+ * @param claudeTool - Claude Agent SDK tool definition
73
+ * @param execute - Optional execute function to wrap
74
+ * @returns ContractSpec tool config and optional handler
75
+ */
76
+ declare function claudeAgentToolToSpecTool(claudeTool: ClaudeAgentTool, execute?: (input: unknown) => Promise<unknown>): {
77
+ config: AgentToolConfig;
78
+ handler?: ToolHandler;
79
+ };
80
+ /**
81
+ * Convert multiple Claude Agent SDK tools to ContractSpec format.
82
+ */
83
+ declare function claudeAgentToolsToSpecTools(claudeTools: (ClaudeAgentTool & {
84
+ execute?: (input: unknown) => Promise<unknown>;
85
+ })[]): {
86
+ configs: AgentToolConfig[];
87
+ handlers: Map<string, ToolHandler>;
88
+ };
89
+ /**
90
+ * Convert ContractSpec tool to ExternalToolDefinition format.
91
+ */
92
+ declare function specToolToExternalTool(tool: AgentToolConfig, handler?: ToolHandler, context?: Partial<ToolExecutionContext>): ExternalToolDefinition;
93
+ /**
94
+ * Extract tool call info from Claude Agent SDK response.
95
+ */
96
+ declare function extractToolCalls(response: {
97
+ content?: {
98
+ type: string;
99
+ id?: string;
100
+ name?: string;
101
+ input?: unknown;
102
+ }[];
103
+ }): {
104
+ toolCallId: string;
105
+ toolName: string;
106
+ args: unknown;
107
+ }[];
108
+ //#endregion
109
+ export { ClaudeAgentTool, ClaudeAgentToolResult, ClaudeAgentToolResultContent, claudeAgentToolToSpecTool, claudeAgentToolsToSpecTools, extractToolCalls, specToolToClaudeAgentTool, specToolToExternalTool, specToolsToClaudeAgentTools };
110
+ //# sourceMappingURL=tool-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-bridge.d.ts","names":[],"sources":["../../../src/providers/claude-agent-sdk/tool-bridge.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AA+EoD,UA3DnC,eAAA,CA2DmC;EAAO;EAuB3C,IAAA,EAAA,MAAA;EACP;EACe,WAAA,EAAA,MAAA;EAAZ;EACO,YAAA,EAAA;IAAR,IAAA,EAAA,QAAA;IACP,UAAA,CAAA,EA9Ea,MA8Eb,CAAA,MAAA,EAAA,OAAA,CAAA;IAAiD,QAAA,CAAA,EAAA,MAAA,EAAA;IAAO,oBAAA,CAAA,EAAA,OAAA;EAwB5C,CAAA;EACF;EACkB,qBAAA,CAAA,EAAA,OAAA;EAEtB;EACE,QAAA,CAAA,EAAA,MAAA;;AAoBZ;;;AAKW,UAvHM,qBAAA,CAuHN;EACa;EAAZ,WAAA,EAAA,MAAA;EAAG;EA0BC,OAAA,EAAA,MAAA,GA9II,4BA8IkB,EAAA;EAC9B;EACI,QAAA,CAAA,EAAA,OAAA;;;;;AAyDI,UAjMC,4BAAA,CAiMe;;;;;;;;;;;;;;;;;iBA3KhB,yBAAA,OACR,0BACG,sBACA,QAAQ,wBAChB;+BAAiD;;;;;iBAuBpC,2BAAA,QACP,6BACG,YAAY,uBACb,QAAQ,yBACf;+BAAiD;;;;;;;;;;iBAwBrC,yBAAA,aACF,+CACkB;UAEtB;YACE;;;;;iBAoBI,2BAAA,eACA;gCACkB;;WAGvB;YACC,YAAY;;;;;iBA0BR,sBAAA,OACR,2BACI,uBACA,QAAQ,wBACjB;;;;iBAuDa,gBAAA"}
@@ -0,0 +1,122 @@
1
+ //#region src/providers/claude-agent-sdk/tool-bridge.ts
2
+ /**
3
+ * Convert a ContractSpec AgentToolConfig to Claude Agent SDK tool format.
4
+ *
5
+ * @param tool - ContractSpec tool configuration
6
+ * @param handler - Tool handler function
7
+ * @param context - Partial execution context to inject
8
+ * @returns Claude Agent SDK tool definition with execute function
9
+ */
10
+ function specToolToClaudeAgentTool(tool, handler, context) {
11
+ return {
12
+ name: tool.name,
13
+ description: tool.description ?? `Execute ${tool.name}`,
14
+ input_schema: normalizeSchema(tool.schema),
15
+ requires_confirmation: tool.requiresApproval ?? !tool.automationSafe,
16
+ execute: async (input) => {
17
+ return handler(input, {
18
+ agentId: context.agentId ?? "unknown",
19
+ sessionId: context.sessionId ?? "unknown",
20
+ tenantId: context.tenantId,
21
+ actorId: context.actorId,
22
+ metadata: context.metadata,
23
+ signal: context.signal
24
+ });
25
+ }
26
+ };
27
+ }
28
+ /**
29
+ * Convert multiple ContractSpec tools to Claude Agent SDK format.
30
+ */
31
+ function specToolsToClaudeAgentTools(tools, handlers, context) {
32
+ return tools.filter((tool) => handlers.has(tool.name)).map((tool) => {
33
+ const handler = handlers.get(tool.name);
34
+ if (!handler) throw new Error(`Handler not found for tool ${tool.name}`);
35
+ return specToolToClaudeAgentTool(tool, handler, context);
36
+ });
37
+ }
38
+ /**
39
+ * Convert a Claude Agent SDK tool to ContractSpec AgentToolConfig.
40
+ * This enables importing tools defined in Claude Agent SDK format.
41
+ *
42
+ * @param claudeTool - Claude Agent SDK tool definition
43
+ * @param execute - Optional execute function to wrap
44
+ * @returns ContractSpec tool config and optional handler
45
+ */
46
+ function claudeAgentToolToSpecTool(claudeTool, execute) {
47
+ return {
48
+ config: {
49
+ name: claudeTool.name,
50
+ description: claudeTool.description,
51
+ schema: claudeTool.input_schema,
52
+ requiresApproval: claudeTool.requires_confirmation,
53
+ automationSafe: !claudeTool.requires_confirmation
54
+ },
55
+ handler: execute ? async (input, _ctx) => String(await execute(input)) : void 0
56
+ };
57
+ }
58
+ /**
59
+ * Convert multiple Claude Agent SDK tools to ContractSpec format.
60
+ */
61
+ function claudeAgentToolsToSpecTools(claudeTools) {
62
+ const configs = [];
63
+ const handlers = /* @__PURE__ */ new Map();
64
+ for (const claudeTool of claudeTools) {
65
+ const { config, handler } = claudeAgentToolToSpecTool(claudeTool, claudeTool.execute);
66
+ configs.push(config);
67
+ if (handler) handlers.set(config.name, handler);
68
+ }
69
+ return {
70
+ configs,
71
+ handlers
72
+ };
73
+ }
74
+ /**
75
+ * Convert ContractSpec tool to ExternalToolDefinition format.
76
+ */
77
+ function specToolToExternalTool(tool, handler, context) {
78
+ return {
79
+ name: tool.name,
80
+ description: tool.description ?? `Execute ${tool.name}`,
81
+ inputSchema: tool.schema ?? { type: "object" },
82
+ requiresApproval: tool.requiresApproval ?? !tool.automationSafe,
83
+ execute: handler ? async (input) => {
84
+ return handler(input, {
85
+ agentId: context?.agentId ?? "unknown",
86
+ sessionId: context?.sessionId ?? "unknown",
87
+ tenantId: context?.tenantId,
88
+ actorId: context?.actorId,
89
+ metadata: context?.metadata,
90
+ signal: context?.signal
91
+ });
92
+ } : void 0
93
+ };
94
+ }
95
+ /**
96
+ * Normalize a schema to Claude Agent SDK's expected format.
97
+ * Ensures the schema is a valid JSON Schema object type.
98
+ */
99
+ function normalizeSchema(schema) {
100
+ if (!schema) return { type: "object" };
101
+ if (schema.type === "object") return schema;
102
+ return {
103
+ type: "object",
104
+ properties: { value: schema },
105
+ required: ["value"]
106
+ };
107
+ }
108
+ /**
109
+ * Extract tool call info from Claude Agent SDK response.
110
+ */
111
+ function extractToolCalls(response) {
112
+ if (!response.content) return [];
113
+ return response.content.filter((block) => block.type === "tool_use").map((block) => ({
114
+ toolCallId: block.id ?? "",
115
+ toolName: block.name ?? "",
116
+ args: block.input
117
+ }));
118
+ }
119
+
120
+ //#endregion
121
+ export { claudeAgentToolToSpecTool, claudeAgentToolsToSpecTools, extractToolCalls, specToolToClaudeAgentTool, specToolToExternalTool, specToolsToClaudeAgentTools };
122
+ //# sourceMappingURL=tool-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-bridge.js","names":["configs: AgentToolConfig[]"],"sources":["../../../src/providers/claude-agent-sdk/tool-bridge.ts"],"sourcesContent":["/**\n * Tool bridge for converting between ContractSpec and Claude Agent SDK tool formats.\n *\n * Provides bidirectional conversion:\n * - ContractSpec AgentToolConfig → Claude Agent SDK tool\n * - Claude Agent SDK tool → ContractSpec AgentToolConfig\n */\n\nimport type { AgentToolConfig } from '../../spec/spec';\nimport type { ToolHandler, ToolExecutionContext } from '../../types';\nimport type { ExternalToolDefinition } from '../types';\n\n// ============================================================================\n// Claude Agent SDK Tool Types (based on SDK API)\n// ============================================================================\n\n/**\n * Claude Agent SDK tool definition.\n * Based on Anthropic's tool format.\n */\nexport interface ClaudeAgentTool {\n /** Tool name */\n name: string;\n /** Tool description */\n description: string;\n /** Input schema in JSON Schema format */\n input_schema: {\n type: 'object';\n properties?: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n };\n /** Whether tool requires confirmation before execution */\n requires_confirmation?: boolean;\n /** Tool category for organization */\n category?: string;\n}\n\n/**\n * Claude Agent SDK tool result.\n */\nexport interface ClaudeAgentToolResult {\n /** Tool call ID this result corresponds to */\n tool_use_id: string;\n /** Result content */\n content: string | ClaudeAgentToolResultContent[];\n /** Whether the tool execution failed */\n is_error?: boolean;\n}\n\n/**\n * Claude Agent SDK tool result content block.\n */\nexport interface ClaudeAgentToolResultContent {\n type: 'text' | 'image';\n text?: string;\n source?: {\n type: 'base64';\n media_type: string;\n data: string;\n };\n}\n\n// ============================================================================\n// ContractSpec → Claude Agent SDK Conversion\n// ============================================================================\n\n/**\n * Convert a ContractSpec AgentToolConfig to Claude Agent SDK tool format.\n *\n * @param tool - ContractSpec tool configuration\n * @param handler - Tool handler function\n * @param context - Partial execution context to inject\n * @returns Claude Agent SDK tool definition with execute function\n */\nexport function specToolToClaudeAgentTool(\n tool: AgentToolConfig,\n handler: ToolHandler,\n context: Partial<ToolExecutionContext>\n): ClaudeAgentTool & { execute: (input: unknown) => Promise<unknown> } {\n return {\n name: tool.name,\n description: tool.description ?? `Execute ${tool.name}`,\n input_schema: normalizeSchema(tool.schema),\n requires_confirmation: tool.requiresApproval ?? !tool.automationSafe,\n execute: async (input: unknown) => {\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 };\n}\n\n/**\n * Convert multiple ContractSpec tools to Claude Agent SDK format.\n */\nexport function specToolsToClaudeAgentTools(\n tools: AgentToolConfig[],\n handlers: Map<string, ToolHandler>,\n context: Partial<ToolExecutionContext>\n): (ClaudeAgentTool & { execute: (input: unknown) => Promise<unknown> })[] {\n return tools\n .filter((tool) => handlers.has(tool.name))\n .map((tool) => {\n const handler = handlers.get(tool.name);\n if (!handler) {\n throw new Error(`Handler not found for tool ${tool.name}`);\n }\n return specToolToClaudeAgentTool(tool, handler, context);\n });\n}\n\n// ============================================================================\n// Claude Agent SDK → ContractSpec Conversion\n// ============================================================================\n\n/**\n * Convert a Claude Agent SDK tool to ContractSpec AgentToolConfig.\n * This enables importing tools defined in Claude Agent SDK format.\n *\n * @param claudeTool - Claude Agent SDK tool definition\n * @param execute - Optional execute function to wrap\n * @returns ContractSpec tool config and optional handler\n */\nexport function claudeAgentToolToSpecTool(\n claudeTool: ClaudeAgentTool,\n execute?: (input: unknown) => Promise<unknown>\n): {\n config: AgentToolConfig;\n handler?: ToolHandler;\n} {\n const config: AgentToolConfig = {\n name: claudeTool.name,\n description: claudeTool.description,\n schema: claudeTool.input_schema,\n requiresApproval: claudeTool.requires_confirmation,\n automationSafe: !claudeTool.requires_confirmation,\n };\n\n const handler: ToolHandler | undefined = execute\n ? async (input, _ctx) => String(await execute(input))\n : undefined;\n\n return { config, handler };\n}\n\n/**\n * Convert multiple Claude Agent SDK tools to ContractSpec format.\n */\nexport function claudeAgentToolsToSpecTools(\n claudeTools: (ClaudeAgentTool & {\n execute?: (input: unknown) => Promise<unknown>;\n })[]\n): {\n configs: AgentToolConfig[];\n handlers: Map<string, ToolHandler>;\n} {\n const configs: AgentToolConfig[] = [];\n const handlers = new Map<string, ToolHandler>();\n\n for (const claudeTool of claudeTools) {\n const { config, handler } = claudeAgentToolToSpecTool(\n claudeTool,\n claudeTool.execute\n );\n configs.push(config);\n if (handler) {\n handlers.set(config.name, handler);\n }\n }\n\n return { configs, handlers };\n}\n\n// ============================================================================\n// External Tool Definition Conversion\n// ============================================================================\n\n/**\n * Convert ContractSpec tool to ExternalToolDefinition format.\n */\nexport function specToolToExternalTool(\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 Normalization\n// ============================================================================\n\n/**\n * Normalize a schema to Claude Agent SDK's expected format.\n * Ensures the schema is a valid JSON Schema object type.\n */\nfunction normalizeSchema(\n schema?: Record<string, unknown>\n): ClaudeAgentTool['input_schema'] {\n if (!schema) {\n return { type: 'object' };\n }\n\n // If it's already an object type schema, return as-is with type assertion\n if (schema.type === 'object') {\n return schema as ClaudeAgentTool['input_schema'];\n }\n\n // Wrap non-object schemas in an object\n return {\n type: 'object',\n properties: {\n value: schema,\n },\n required: ['value'],\n };\n}\n\n/**\n * Extract tool call info from Claude Agent SDK response.\n */\nexport function extractToolCalls(response: {\n content?: {\n type: string;\n id?: string;\n name?: string;\n input?: unknown;\n }[];\n}): {\n toolCallId: string;\n toolName: string;\n args: unknown;\n}[] {\n if (!response.content) {\n return [];\n }\n\n return response.content\n .filter((block) => block.type === 'tool_use')\n .map((block) => ({\n toolCallId: block.id ?? '',\n toolName: block.name ?? '',\n args: block.input,\n }));\n}\n"],"mappings":";;;;;;;;;AA2EA,SAAgB,0BACd,MACA,SACA,SACqE;AACrE,QAAO;EACL,MAAM,KAAK;EACX,aAAa,KAAK,eAAe,WAAW,KAAK;EACjD,cAAc,gBAAgB,KAAK,OAAO;EAC1C,uBAAuB,KAAK,oBAAoB,CAAC,KAAK;EACtD,SAAS,OAAO,UAAmB;AASjC,UAAO,QAAQ,OAR2B;IACxC,SAAS,QAAQ,WAAW;IAC5B,WAAW,QAAQ,aAAa;IAChC,UAAU,QAAQ;IAClB,SAAS,QAAQ;IACjB,UAAU,QAAQ;IAClB,QAAQ,QAAQ;IACjB,CACiC;;EAErC;;;;;AAMH,SAAgB,4BACd,OACA,UACA,SACyE;AACzE,QAAO,MACJ,QAAQ,SAAS,SAAS,IAAI,KAAK,KAAK,CAAC,CACzC,KAAK,SAAS;EACb,MAAM,UAAU,SAAS,IAAI,KAAK,KAAK;AACvC,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,8BAA8B,KAAK,OAAO;AAE5D,SAAO,0BAA0B,MAAM,SAAS,QAAQ;GACxD;;;;;;;;;;AAeN,SAAgB,0BACd,YACA,SAIA;AAaA,QAAO;EAAE,QAZuB;GAC9B,MAAM,WAAW;GACjB,aAAa,WAAW;GACxB,QAAQ,WAAW;GACnB,kBAAkB,WAAW;GAC7B,gBAAgB,CAAC,WAAW;GAC7B;EAMgB,SAJwB,UACrC,OAAO,OAAO,SAAS,OAAO,MAAM,QAAQ,MAAM,CAAC,GACnD;EAEsB;;;;;AAM5B,SAAgB,4BACd,aAMA;CACA,MAAMA,UAA6B,EAAE;CACrC,MAAM,2BAAW,IAAI,KAA0B;AAE/C,MAAK,MAAM,cAAc,aAAa;EACpC,MAAM,EAAE,QAAQ,YAAY,0BAC1B,YACA,WAAW,QACZ;AACD,UAAQ,KAAK,OAAO;AACpB,MAAI,QACF,UAAS,IAAI,OAAO,MAAM,QAAQ;;AAItC,QAAO;EAAE;EAAS;EAAU;;;;;AAU9B,SAAgB,uBACd,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;;;;;;AAWH,SAAS,gBACP,QACiC;AACjC,KAAI,CAAC,OACH,QAAO,EAAE,MAAM,UAAU;AAI3B,KAAI,OAAO,SAAS,SAClB,QAAO;AAIT,QAAO;EACL,MAAM;EACN,YAAY,EACV,OAAO,QACR;EACD,UAAU,CAAC,QAAQ;EACpB;;;;;AAMH,SAAgB,iBAAiB,UAW7B;AACF,KAAI,CAAC,SAAS,QACZ,QAAO,EAAE;AAGX,QAAO,SAAS,QACb,QAAQ,UAAU,MAAM,SAAS,WAAW,CAC5C,KAAK,WAAW;EACf,YAAY,MAAM,MAAM;EACxB,UAAU,MAAM,QAAQ;EACxB,MAAM,MAAM;EACb,EAAE"}
@@ -0,0 +1,7 @@
1
+ import { ClaudeAgentContextMetadata, ClaudeAgentSDKConfig, ContextCreationError, ExternalAgentContext, ExternalAgentProvider, ExternalExecuteParams, ExternalExecuteResult, ExternalProviderError, ExternalProviderFactory, ExternalStreamChunk, ExternalToolDefinition, ExternalToolSet, ExternalUsage, OpenCodeAgentType, OpenCodeContextMetadata, OpenCodeSDKConfig, ProviderExecutionError, ProviderNotAvailableError, ProviderRegistry } from "./types.js";
2
+ import { ClaudeAgentSDKProvider } from "./claude-agent-sdk/adapter.js";
3
+ import "./claude-agent-sdk/index.js";
4
+ import { OpenCodeSDKProvider } from "./opencode-sdk/adapter.js";
5
+ import "./opencode-sdk/index.js";
6
+ import { createProviderRegistry, defaultProviderRegistry } from "./registry.js";
7
+ export { ClaudeAgentContextMetadata, ClaudeAgentSDKConfig, ClaudeAgentSDKProvider, ContextCreationError, ExternalAgentContext, ExternalAgentProvider, ExternalExecuteParams, ExternalExecuteResult, ExternalProviderError, ExternalProviderFactory, ExternalStreamChunk, ExternalToolDefinition, ExternalToolSet, ExternalUsage, OpenCodeAgentType, OpenCodeContextMetadata, OpenCodeSDKConfig, OpenCodeSDKProvider, ProviderExecutionError, ProviderNotAvailableError, ProviderRegistry, createProviderRegistry, defaultProviderRegistry };
@@ -0,0 +1,8 @@
1
+ import { ContextCreationError, ExternalProviderError, ProviderExecutionError, ProviderNotAvailableError } from "./types.js";
2
+ import { ClaudeAgentSDKProvider } from "./claude-agent-sdk/adapter.js";
3
+ import "./claude-agent-sdk/index.js";
4
+ import { OpenCodeSDKProvider } from "./opencode-sdk/adapter.js";
5
+ import "./opencode-sdk/index.js";
6
+ import { createProviderRegistry, defaultProviderRegistry } from "./registry.js";
7
+
8
+ export { ClaudeAgentSDKProvider, ContextCreationError, ExternalProviderError, OpenCodeSDKProvider, ProviderExecutionError, ProviderNotAvailableError, createProviderRegistry, defaultProviderRegistry };
@@ -0,0 +1,54 @@
1
+ import { AgentSpec } from "../../spec/spec.js";
2
+ import { ExternalAgentContext, ExternalAgentProvider, ExternalExecuteParams, ExternalExecuteResult, ExternalStreamChunk, OpenCodeSDKConfig } from "../types.js";
3
+
4
+ //#region src/providers/opencode-sdk/adapter.d.ts
5
+
6
+ /**
7
+ * OpenCode SDK Provider implementation.
8
+ */
9
+ declare class OpenCodeSDKProvider implements ExternalAgentProvider {
10
+ readonly name = "opencode-sdk";
11
+ readonly version = "1.0.0";
12
+ private config;
13
+ private sdkAvailable;
14
+ constructor(config?: OpenCodeSDKConfig);
15
+ /**
16
+ * Check if OpenCode 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 OpenCode 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 OpenCode SDK dynamically.
33
+ */
34
+ private loadSDK;
35
+ /**
36
+ * Get hostname from server URL.
37
+ */
38
+ private getHostname;
39
+ /**
40
+ * Extract tool calls from response.
41
+ */
42
+ private extractToolCalls;
43
+ /**
44
+ * Extract text content from response.
45
+ */
46
+ private extractTextContent;
47
+ /**
48
+ * Map OpenCode finish reason to ContractSpec finish reason.
49
+ */
50
+ private mapFinishReason;
51
+ }
52
+ //#endregion
53
+ export { OpenCodeSDKProvider };
54
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","names":[],"sources":["../../../src/providers/opencode-sdk/adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA+C4C,cAA/B,mBAAA,YAA+B,qBAAA,CAAA;EAAqB,SAAA,IAAA,GAAA,cAAA;;;;uBAO3C;;;;;;;;sBAsCM,YAAY,QAAQ;;;;mBA0EnC,8BACD,wBACP,QAAQ;;;;kBAuEA,8BACD,wBACP,cAAc"}