@seonggukchoi/opencode-claude-code-provider 0.1.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/README.md ADDED
@@ -0,0 +1,99 @@
1
+ # @seonggukchoi/opencode-claude-code-provider
2
+
3
+ Claude Agent SDK based provider for OpenCode.
4
+
5
+ ## What it does
6
+
7
+ - Exposes a custom `LanguageModelV2` provider named `claude-code`
8
+ - Uses `@anthropic-ai/claude-agent-sdk` as the runtime adapter behind OpenCode
9
+ - Maps native tools (`bash`, `read`, `write`, `edit`, `glob`, `grep`) to Claude built-ins
10
+ - Re-exposes OpenCode-hosted tools through an in-process MCP bridge
11
+ - Persists the Claude session id in `providerMetadata["claude-code"].sessionId`
12
+
13
+ ## Supported bridge tools
14
+
15
+ - `question`
16
+ - `task`
17
+ - `todowrite`
18
+ - `webfetch`
19
+ - `websearch`
20
+ - `oc_websearch`
21
+ - `oc_apply_patch`
22
+ - `oc_codesearch`
23
+ - JSON Schema based custom tools when the schema is a basic object shape
24
+
25
+ ## Fallback rules
26
+
27
+ - Prefer `websearch` when OpenCode exposes it directly
28
+ - Use `oc_websearch` when the default `websearch` name is hidden by tool gating
29
+ - Keep `webfetch` bridged through OpenCode so the host-side formatting and fallback behavior stay consistent
30
+
31
+ ## Known limits
32
+
33
+ - Remote OAuth MCP servers are skipped and surfaced as warnings
34
+ - Non-streaming generation is intentionally not supported
35
+ - JSON Schema to Zod conversion is best-effort and currently supports common object, array, string, number, integer, and boolean shapes
36
+ - OpenCode custom providers still need a `models` block in config for model discovery
37
+ - OpenCode 1.3.0 currently breaks direct `file:` package loading by appending `@latest`
38
+ - Claude sessions always run with `permissionMode: "bypassPermissions"` and `allowDangerouslySkipPermissions: true` internally, so OpenCode remains the permission authority
39
+
40
+ ## Configuration examples
41
+
42
+ ```json
43
+ {
44
+ "plugin": ["@seonggukchoi/opencode-claude-code-plugin"],
45
+ "provider": {
46
+ "claude-code": {
47
+ "npm": "@seonggukchoi/opencode-claude-code-provider",
48
+ "models": {
49
+ "sonnet": { "id": "claude-sonnet-4-6" },
50
+ "opus": { "id": "claude-opus-4-6" },
51
+ "haiku": { "id": "claude-haiku-4-5" }
52
+ }
53
+ }
54
+ },
55
+ "model": "claude-code/sonnet"
56
+ }
57
+ ```
58
+
59
+ - Full config example: `packages/opencode-claude-code-provider/docs/config.example.json`
60
+ - Minimal config example: `packages/opencode-claude-code-provider/docs/config.minimal.example.json`
61
+
62
+ OpenCode custom providers still require a `models` block for model discovery, so the minimal example keeps only the model ids.
63
+
64
+ The provider always forces Claude permission bypass mode, so you do not need to configure Claude-side permission behavior separately.
65
+
66
+ For local unpublished testing, replace the package names in those examples with your local install strategy such as a tarball or registry override.
67
+
68
+ ## Local testing
69
+
70
+ - Build:
71
+ - `pnpm --filter @seonggukchoi/opencode-claude-code-provider build`
72
+ - `pnpm --filter @seonggukchoi/opencode-claude-code-plugin build`
73
+ - Smoke test:
74
+ - `pnpm --filter @seonggukchoi/opencode-claude-code-provider test:smoke`
75
+ - Smoke script:
76
+ - `packages/opencode-claude-code-provider/test/smoke.mjs`
77
+ - Current limitation:
78
+ - OpenCode 1.3.0 breaks direct `file:` package loading by appending `@latest`
79
+
80
+ ## Failure handling
81
+
82
+ - Missing CLI executable: expect a process spawn failure such as `ENOENT`
83
+ - Unsupported auth status command on older CLI builds: use `claude auth status || claude doctor`
84
+ - Unsupported tool schema: the provider skips bridging unless a curated or generic Zod shape can be built
85
+ - Unbridgeable MCP server: the provider emits an `error` stream part with a diagnostic warning and continues
86
+
87
+ ## Release checklist
88
+
89
+ - `pnpm --filter @seonggukchoi/opencode-claude-code-provider test`
90
+ - `pnpm --filter @seonggukchoi/opencode-claude-code-provider build`
91
+ - `pnpm --filter @seonggukchoi/opencode-claude-code-provider test:smoke`
92
+ - Verify `packages/opencode-claude-code-provider/docs/config.example.json`
93
+ - Verify `packages/opencode-claude-code-provider/docs/config.minimal.example.json`
94
+
95
+ ## Internal docs
96
+
97
+ - Full config example: `packages/opencode-claude-code-provider/docs/config.example.json`
98
+ - Minimal config example: `packages/opencode-claude-code-provider/docs/config.minimal.example.json`
99
+ - Smoke test: `packages/opencode-claude-code-provider/test/smoke.mjs`
@@ -0,0 +1,18 @@
1
+ import type { BridgeContext } from './types.js';
2
+ import type { McpServerConfig } from '@anthropic-ai/claude-agent-sdk';
3
+ export declare const NATIVE_TOOL_NAME_MAP: {
4
+ readonly bash: "Bash";
5
+ readonly edit: "Edit";
6
+ readonly glob: "Glob";
7
+ readonly grep: "Grep";
8
+ readonly read: "Read";
9
+ readonly write: "Write";
10
+ };
11
+ type BuiltBridge = {
12
+ allowedTools: string[];
13
+ bridgedToolNames: string[];
14
+ mcpServers: Record<string, McpServerConfig>;
15
+ nativeTools: string[];
16
+ };
17
+ export declare function buildBridge(context: BridgeContext): BuiltBridge;
18
+ export {};
package/dist/bridge.js ADDED
@@ -0,0 +1,181 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { createSdkMcpServer, tool } from '@anthropic-ai/claude-agent-sdk';
3
+ import { z } from 'zod';
4
+ import { jsonSchemaToZodObjectShape } from './schema.js';
5
+ import { isRecord } from './types.js';
6
+ export const NATIVE_TOOL_NAME_MAP = {
7
+ bash: 'Bash',
8
+ edit: 'Edit',
9
+ glob: 'Glob',
10
+ grep: 'Grep',
11
+ read: 'Read',
12
+ write: 'Write',
13
+ };
14
+ export function buildBridge(context) {
15
+ const toolDefinitions = normalizeTools(context.tools);
16
+ const enabledNative = new Set(context.nativeTools ?? Object.keys(NATIVE_TOOL_NAME_MAP));
17
+ const enabledBridge = new Set(context.bridgeTools ?? []);
18
+ const nativeTools = [];
19
+ const bridgeDefinitions = [];
20
+ const bridgedToolNames = [];
21
+ for (const definition of toolDefinitions) {
22
+ const nativeName = NATIVE_TOOL_NAME_MAP[definition.name];
23
+ if (nativeName && enabledNative.has(definition.name)) {
24
+ nativeTools.push(nativeName);
25
+ continue;
26
+ }
27
+ if (enabledBridge.size > 0 && !enabledBridge.has(definition.name)) {
28
+ continue;
29
+ }
30
+ const bridgeDefinition = createBridgeToolDefinition(definition, context);
31
+ if (!bridgeDefinition) {
32
+ continue;
33
+ }
34
+ bridgedToolNames.push(definition.name);
35
+ bridgeDefinitions.push(bridgeDefinition);
36
+ }
37
+ const mcpServers = {};
38
+ if (bridgeDefinitions.length > 0) {
39
+ mcpServers.opencode = createSdkMcpServer({
40
+ name: 'opencode',
41
+ tools: bridgeDefinitions,
42
+ version: '0.1.0',
43
+ });
44
+ }
45
+ return {
46
+ allowedTools: [...nativeTools, ...(bridgeDefinitions.length > 0 ? ['mcp__opencode__*'] : [])],
47
+ bridgedToolNames,
48
+ mcpServers,
49
+ nativeTools,
50
+ };
51
+ }
52
+ function createBridgeToolDefinition(definition, context) {
53
+ if (definition.name === 'question') {
54
+ return tool(definition.name, definition.description ?? 'Ask the user a structured question.', {
55
+ questions: z.array(z.object({
56
+ header: z.string(),
57
+ multiple: z.boolean().optional(),
58
+ options: z.array(z.object({
59
+ description: z.string(),
60
+ label: z.string(),
61
+ })),
62
+ question: z.string(),
63
+ })),
64
+ }, async (args) => executeTool(definition, args, context));
65
+ }
66
+ if (definition.name === 'apply_patch' || definition.name === 'oc_apply_patch') {
67
+ return tool(definition.name, definition.description ?? 'Apply a textual patch to workspace files.', {
68
+ patchText: z.string(),
69
+ }, async (args) => executeTool(definition, args, context));
70
+ }
71
+ if (definition.name === 'codesearch' || definition.name === 'oc_codesearch') {
72
+ return tool(definition.name, definition.description ?? 'Search indexed code context.', {
73
+ query: z.string(),
74
+ tokensNum: z.number().int().min(1000).max(50000).default(5000),
75
+ }, async (args) => executeTool(definition, args, context));
76
+ }
77
+ if (definition.name === 'task') {
78
+ return tool(definition.name, definition.description ?? 'Launch a subagent task.', {
79
+ command: z.string().optional(),
80
+ description: z.string(),
81
+ prompt: z.string(),
82
+ subagent_type: z.string(),
83
+ task_id: z.string().optional(),
84
+ }, async (args) => executeTool(definition, args, context));
85
+ }
86
+ if (definition.name === 'todowrite') {
87
+ return tool(definition.name, definition.description ?? 'Write the current structured todo list.', {
88
+ todos: z.array(z.object({
89
+ content: z.string(),
90
+ priority: z.enum(['high', 'medium', 'low']),
91
+ status: z.enum(['pending', 'in_progress', 'completed', 'cancelled']),
92
+ })),
93
+ }, async (args) => executeTool(definition, args, context));
94
+ }
95
+ if (definition.name === 'webfetch') {
96
+ return tool(definition.name, definition.description ?? 'Fetch a web page as markdown, text, or html.', {
97
+ format: z.enum(['markdown', 'text', 'html']).default('markdown'),
98
+ timeout: z.number().int().positive().max(120).optional(),
99
+ url: z.string().url(),
100
+ }, async (args) => executeTool(definition, args, context));
101
+ }
102
+ if (definition.name === 'websearch' || definition.name === 'oc_websearch') {
103
+ return tool(definition.name, definition.description ?? 'Search the web for current information.', {
104
+ query: z.string(),
105
+ }, async (args) => executeTool(definition, args, context));
106
+ }
107
+ const genericShape = jsonSchemaToZodObjectShape(definition.inputSchema);
108
+ if (genericShape) {
109
+ return tool(definition.name, definition.description ?? `Execute the ${definition.name} tool.`, genericShape, async (args) => executeTool(definition, args, context));
110
+ }
111
+ return undefined;
112
+ }
113
+ async function executeTool(definition, args, context) {
114
+ if (typeof definition.execute !== 'function') {
115
+ return {
116
+ content: [
117
+ {
118
+ text: `Tool "${definition.name}" is visible to Claude but no provider-side executor was attached.`,
119
+ type: 'text',
120
+ },
121
+ ],
122
+ isError: true,
123
+ };
124
+ }
125
+ try {
126
+ const output = await definition.execute(args, {
127
+ abortSignal: context.abortSignal,
128
+ messages: context.prompt,
129
+ toolCallId: randomUUID(),
130
+ });
131
+ if (isRecord(output) && Array.isArray(output.content)) {
132
+ return output;
133
+ }
134
+ return {
135
+ content: [{ text: toText(output), type: 'text' }],
136
+ };
137
+ }
138
+ catch (error) {
139
+ return {
140
+ content: [{ text: toText(error), type: 'text' }],
141
+ isError: true,
142
+ };
143
+ }
144
+ }
145
+ function normalizeTools(input) {
146
+ if (Array.isArray(input)) {
147
+ return input.filter(isFunctionTool);
148
+ }
149
+ if (!isRecord(input)) {
150
+ return [];
151
+ }
152
+ return Object.entries(input)
153
+ .map(([name, value]) => {
154
+ if (!isRecord(value)) {
155
+ return undefined;
156
+ }
157
+ return {
158
+ ...value,
159
+ name,
160
+ };
161
+ })
162
+ .filter((value) => value !== undefined && typeof value.name === 'string');
163
+ }
164
+ function isFunctionTool(input) {
165
+ return isRecord(input) && input.type === 'function' && typeof input.name === 'string';
166
+ }
167
+ function toText(value) {
168
+ if (typeof value === 'string') {
169
+ return value;
170
+ }
171
+ if (value instanceof Error) {
172
+ return value.message;
173
+ }
174
+ try {
175
+ return JSON.stringify(value, null, 2);
176
+ }
177
+ catch {
178
+ return String(value);
179
+ }
180
+ }
181
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ClaudeCodeProviderOptions } from './types.js';
2
+ import type { LanguageModelV2 } from '@ai-sdk/provider';
3
+ export type { ClaudeCodeProviderOptions, NormalizedClaudeCodeOptions, OpenCodeToolLike } from './types.js';
4
+ export { ClaudeCodeLanguageModel } from './model.js';
5
+ export { buildBridge, NATIVE_TOOL_NAME_MAP } from './bridge.js';
6
+ export { buildPrompt, getSystem, loadClaudeMd } from './prompt.js';
7
+ export { mapSdkMessage, createStreamState } from './messages.js';
8
+ export { getResume } from './resume.js';
9
+ export { toAgentMcp } from './mcp.js';
10
+ export { jsonSchemaToZod, jsonSchemaToZodObjectShape } from './schema.js';
11
+ export declare function createClaudeCode(options?: ClaudeCodeProviderOptions): {
12
+ languageModel: (modelId: string) => LanguageModelV2;
13
+ chat: (modelId: string) => LanguageModelV2;
14
+ responses: (modelId: string) => LanguageModelV2;
15
+ };
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ import { ClaudeCodeLanguageModel } from './model.js';
2
+ export { ClaudeCodeLanguageModel } from './model.js';
3
+ export { buildBridge, NATIVE_TOOL_NAME_MAP } from './bridge.js';
4
+ export { buildPrompt, getSystem, loadClaudeMd } from './prompt.js';
5
+ export { mapSdkMessage, createStreamState } from './messages.js';
6
+ export { getResume } from './resume.js';
7
+ export { toAgentMcp } from './mcp.js';
8
+ export { jsonSchemaToZod, jsonSchemaToZodObjectShape } from './schema.js';
9
+ export function createClaudeCode(options = {}) {
10
+ const make = (modelId) => new ClaudeCodeLanguageModel(modelId, options);
11
+ return {
12
+ languageModel: make,
13
+ chat: make,
14
+ responses: make,
15
+ };
16
+ }
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAOrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAE1E,MAAM,UAAU,gBAAgB,CAAC,UAAqC,EAAE;IACtE,MAAM,IAAI,GAAG,CAAC,OAAe,EAAmB,EAAE,CAAC,IAAI,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEjG,OAAO;QACL,aAAa,EAAE,IAAI;QACnB,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import type { OpenCodeMcpConfig } from './types.js';
2
+ import type { McpServerConfig } from '@anthropic-ai/claude-agent-sdk';
3
+ export declare function toAgentMcp(input: OpenCodeMcpConfig | undefined): {
4
+ servers: Record<string, McpServerConfig>;
5
+ warnings: string[];
6
+ };
package/dist/mcp.js ADDED
@@ -0,0 +1,33 @@
1
+ import { isRecord } from './types.js';
2
+ export function toAgentMcp(input) {
3
+ if (!input) {
4
+ return { servers: {}, warnings: [] };
5
+ }
6
+ const warnings = [];
7
+ const servers = {};
8
+ for (const [name, value] of Object.entries(input)) {
9
+ if (value.enabled === false) {
10
+ continue;
11
+ }
12
+ if (value.type === 'local') {
13
+ const [command, ...args] = value.command;
14
+ if (!command) {
15
+ warnings.push(`MCP server "${name}" is skipped because no command was provided.`);
16
+ continue;
17
+ }
18
+ servers[name] = { args, command, env: value.environment, type: 'stdio' };
19
+ continue;
20
+ }
21
+ if (value.oauth !== undefined && value.oauth !== false) {
22
+ warnings.push(`MCP server "${name}" is skipped because OAuth bridging is not supported yet.`);
23
+ continue;
24
+ }
25
+ if (!isRecord(value)) {
26
+ continue;
27
+ }
28
+ const transport = value.transport === 'sse' ? 'sse' : 'http';
29
+ servers[name] = { headers: value.headers, type: transport, url: value.url };
30
+ }
31
+ return { servers, warnings };
32
+ }
33
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKtC,MAAM,UAAU,UAAU,CAAC,KAAoC;IAI7D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAoC,EAAE,CAAC;IAEpD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;YAEzC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,eAAe,IAAI,+CAA+C,CAAC,CAAC;gBAClF,SAAS;YACX,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YACzE,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACvD,QAAQ,CAAC,IAAI,CAAC,eAAe,IAAI,2DAA2D,CAAC,CAAC;YAC9F,SAAS;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IAC9E,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { LanguageModelV2FinishReason, LanguageModelV2StreamPart, LanguageModelV2Usage } from '@ai-sdk/provider';
2
+ import type { SDKMessage } from '@anthropic-ai/claude-agent-sdk';
3
+ type BlockState = {
4
+ id: string;
5
+ index: number;
6
+ kind: 'reasoning';
7
+ } | {
8
+ id: string;
9
+ index: number;
10
+ kind: 'text';
11
+ } | {
12
+ id: string;
13
+ index: number;
14
+ inputText: string;
15
+ kind: 'tool';
16
+ toolName: string;
17
+ };
18
+ export type StreamState = {
19
+ blocks: Map<number, BlockState>;
20
+ finishReason: LanguageModelV2FinishReason;
21
+ sessionId?: string;
22
+ toolNames: Map<string, string>;
23
+ usage: LanguageModelV2Usage;
24
+ };
25
+ export declare function createStreamState(): StreamState;
26
+ export declare function mapSdkMessage(message: SDKMessage, state: StreamState): LanguageModelV2StreamPart[];
27
+ export {};
@@ -0,0 +1,199 @@
1
+ import { isRecord } from './types.js';
2
+ export function createStreamState() {
3
+ return {
4
+ blocks: new Map(),
5
+ finishReason: 'unknown',
6
+ toolNames: new Map(),
7
+ usage: {
8
+ inputTokens: undefined,
9
+ outputTokens: undefined,
10
+ totalTokens: undefined,
11
+ },
12
+ };
13
+ }
14
+ export function mapSdkMessage(message, state) {
15
+ if (message.type === 'system' && message.subtype === 'init') {
16
+ state.sessionId = message.session_id;
17
+ return [];
18
+ }
19
+ if (message.type === 'stream_event') {
20
+ return mapStreamEvent(message.event, state);
21
+ }
22
+ if (message.type === 'user') {
23
+ return mapToolResultMessage(message, state);
24
+ }
25
+ if (message.type === 'result') {
26
+ state.finishReason = mapFinishReason(message);
27
+ state.usage = mapUsage(message);
28
+ }
29
+ return [];
30
+ }
31
+ function mapStreamEvent(event, state) {
32
+ if (!isRecord(event)) {
33
+ return [];
34
+ }
35
+ const eventType = getString(event.type);
36
+ const index = getNumber(event.index) ?? 0;
37
+ if (eventType === 'content_block_start') {
38
+ return onContentBlockStart(event, index, state);
39
+ }
40
+ if (eventType === 'content_block_delta') {
41
+ return onContentBlockDelta(event, index, state);
42
+ }
43
+ if (eventType === 'content_block_stop') {
44
+ return onContentBlockStop(index, state);
45
+ }
46
+ return [];
47
+ }
48
+ function onContentBlockStart(event, index, state) {
49
+ const block = getRecord(event.content_block) ?? getRecord(event.block);
50
+ if (!block) {
51
+ return [];
52
+ }
53
+ const blockType = getString(block.type);
54
+ if (blockType === 'text') {
55
+ const id = `text-${index}`;
56
+ state.blocks.set(index, { id, index, kind: 'text' });
57
+ return [{ id, type: 'text-start' }];
58
+ }
59
+ if (blockType === 'thinking' || blockType === 'redacted_thinking') {
60
+ const id = `reasoning-${index}`;
61
+ state.blocks.set(index, { id, index, kind: 'reasoning' });
62
+ return [{ id, type: 'reasoning-start' }];
63
+ }
64
+ if (blockType === 'tool_use') {
65
+ const id = getString(block.id) ?? `tool-${index}`;
66
+ const toolName = getString(block.name) ?? 'unknown';
67
+ const initialInput = block.input === undefined ? '' : safeJsonStringify(block.input);
68
+ state.blocks.set(index, { id, index, inputText: initialInput, kind: 'tool', toolName });
69
+ state.toolNames.set(id, toolName);
70
+ const parts = [
71
+ {
72
+ id,
73
+ providerExecuted: true,
74
+ toolName,
75
+ type: 'tool-input-start',
76
+ },
77
+ ];
78
+ if (initialInput.length > 0) {
79
+ parts.push({ delta: initialInput, id, type: 'tool-input-delta' });
80
+ }
81
+ return parts;
82
+ }
83
+ return [];
84
+ }
85
+ function onContentBlockDelta(event, index, state) {
86
+ const block = state.blocks.get(index);
87
+ const delta = getRecord(event.delta);
88
+ if (!block || !delta) {
89
+ return [];
90
+ }
91
+ const deltaType = getString(delta.type);
92
+ if (block.kind === 'text' && deltaType === 'text_delta') {
93
+ const text = getString(delta.text) ?? '';
94
+ return text.length > 0 ? [{ delta: text, id: block.id, type: 'text-delta' }] : [];
95
+ }
96
+ if (block.kind === 'reasoning' && (deltaType === 'thinking_delta' || deltaType === 'text_delta')) {
97
+ const text = getString(delta.text) ?? '';
98
+ return text.length > 0 ? [{ delta: text, id: block.id, type: 'reasoning-delta' }] : [];
99
+ }
100
+ if (block.kind === 'tool') {
101
+ const chunk = getString(delta.partial_json) ?? getString(delta.text) ?? '';
102
+ if (chunk.length === 0) {
103
+ return [];
104
+ }
105
+ block.inputText += chunk;
106
+ return [{ delta: chunk, id: block.id, type: 'tool-input-delta' }];
107
+ }
108
+ return [];
109
+ }
110
+ function onContentBlockStop(index, state) {
111
+ const block = state.blocks.get(index);
112
+ if (!block) {
113
+ return [];
114
+ }
115
+ state.blocks.delete(index);
116
+ if (block.kind === 'text') {
117
+ return [{ id: block.id, type: 'text-end' }];
118
+ }
119
+ if (block.kind === 'reasoning') {
120
+ return [{ id: block.id, type: 'reasoning-end' }];
121
+ }
122
+ return [
123
+ { id: block.id, type: 'tool-input-end' },
124
+ {
125
+ input: block.inputText || '{}',
126
+ providerExecuted: true,
127
+ toolCallId: block.id,
128
+ toolName: block.toolName,
129
+ type: 'tool-call',
130
+ },
131
+ ];
132
+ }
133
+ function mapToolResultMessage(message, state) {
134
+ if (!message.parent_tool_use_id || message.tool_use_result === undefined) {
135
+ return [];
136
+ }
137
+ const toolName = state.toolNames.get(message.parent_tool_use_id) ?? 'unknown';
138
+ return [
139
+ {
140
+ providerExecuted: true,
141
+ result: message.tool_use_result,
142
+ toolCallId: message.parent_tool_use_id,
143
+ toolName,
144
+ type: 'tool-result',
145
+ },
146
+ ];
147
+ }
148
+ function mapFinishReason(message) {
149
+ if (message.subtype !== 'success') {
150
+ return 'error';
151
+ }
152
+ if (message.stop_reason === 'tool_use') {
153
+ return 'tool-calls';
154
+ }
155
+ if (message.stop_reason === 'max_tokens') {
156
+ return 'length';
157
+ }
158
+ if (message.stop_reason === 'end_turn' || message.stop_reason === 'stop_sequence') {
159
+ return 'stop';
160
+ }
161
+ return 'unknown';
162
+ }
163
+ function mapUsage(message) {
164
+ const usage = message.usage;
165
+ const inputTokens = getNumber(usage.input_tokens);
166
+ const outputTokens = getNumber(usage.output_tokens);
167
+ return {
168
+ cachedInputTokens: getNumber(usage.cache_read_input_tokens),
169
+ inputTokens,
170
+ outputTokens,
171
+ reasoningTokens: getNumber(usage.thinking_tokens),
172
+ totalTokens: getNumber(usage.total_tokens) ?? sumNumbers(inputTokens, outputTokens),
173
+ };
174
+ }
175
+ function sumNumbers(...values) {
176
+ const next = values.filter((value) => typeof value === 'number');
177
+ if (next.length === 0) {
178
+ return undefined;
179
+ }
180
+ return next.reduce((total, value) => total + value, 0);
181
+ }
182
+ function getString(value) {
183
+ return typeof value === 'string' ? value : undefined;
184
+ }
185
+ function getNumber(value) {
186
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
187
+ }
188
+ function getRecord(value) {
189
+ return isRecord(value) ? value : undefined;
190
+ }
191
+ function safeJsonStringify(value) {
192
+ try {
193
+ return JSON.stringify(value);
194
+ }
195
+ catch {
196
+ return '{}';
197
+ }
198
+ }
199
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { ClaudeCodeProviderOptions } from './types.js';
2
+ import type { LanguageModelV2, LanguageModelV2CallOptions, LanguageModelV2StreamPart } from '@ai-sdk/provider';
3
+ export declare class ClaudeCodeLanguageModel implements LanguageModelV2 {
4
+ private readonly defaults;
5
+ readonly modelId: string;
6
+ readonly provider = "claude-code";
7
+ readonly specificationVersion: "v2";
8
+ readonly supportedUrls: Record<string, RegExp[]>;
9
+ constructor(modelId: string, defaults?: ClaudeCodeProviderOptions);
10
+ doGenerate(): Promise<never>;
11
+ doStream(options: LanguageModelV2CallOptions): Promise<{
12
+ request: {
13
+ body: {
14
+ allowedTools: string[];
15
+ model: string;
16
+ prompt: string;
17
+ resume: string | undefined;
18
+ system: string;
19
+ tools: string[];
20
+ };
21
+ };
22
+ response: {
23
+ headers: {};
24
+ };
25
+ stream: ReadableStream<LanguageModelV2StreamPart>;
26
+ }>;
27
+ }