@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/dist/model.js ADDED
@@ -0,0 +1,142 @@
1
+ import { query } from '@anthropic-ai/claude-agent-sdk';
2
+ import { buildBridge } from './bridge.js';
3
+ import { toAgentMcp } from './mcp.js';
4
+ import { createStreamState, mapSdkMessage } from './messages.js';
5
+ import { buildPrompt, getSystem, loadClaudeMd } from './prompt.js';
6
+ import { getResume } from './resume.js';
7
+ import { normalizeProviderOptions } from './types.js';
8
+ export class ClaudeCodeLanguageModel {
9
+ constructor(modelId, defaults = {}) {
10
+ this.defaults = defaults;
11
+ this.provider = 'claude-code';
12
+ this.specificationVersion = 'v2';
13
+ this.supportedUrls = {};
14
+ this.modelId = modelId;
15
+ }
16
+ async doGenerate() {
17
+ throw new Error('Claude Code provider only supports the streaming path. Use doStream() instead.');
18
+ }
19
+ async doStream(options) {
20
+ const normalizedOptions = normalizeProviderOptions((options.providerOptions?.['claude-code'] ?? undefined), this.defaults);
21
+ const bridge = buildBridge({
22
+ abortSignal: options.abortSignal,
23
+ bridgeTools: normalizedOptions.bridgeTools,
24
+ nativeTools: normalizedOptions.nativeTools,
25
+ prompt: options.prompt,
26
+ tools: options.tools,
27
+ });
28
+ const opencodeMcp = normalizedOptions.bridgeOpenCodeMcp ? toAgentMcp(normalizedOptions.openCodeMcp) : { servers: {}, warnings: [] };
29
+ const resumeSessionId = getResume(options.prompt, this.modelId);
30
+ const prompt = buildPrompt(options.prompt, { resumeSessionId });
31
+ const claudeMd = await loadClaudeMd({
32
+ cwd: normalizedOptions.cwd,
33
+ explicitPath: normalizedOptions.claudeMdPath,
34
+ loadClaudeMd: normalizedOptions.loadClaudeMd,
35
+ });
36
+ const system = [getSystem(options.prompt), claudeMd].filter((value) => Boolean(value)).join('\n\n');
37
+ const streamState = createStreamState();
38
+ const abortController = new AbortController();
39
+ const currentModelId = this.modelId;
40
+ options.abortSignal?.addEventListener('abort', () => {
41
+ abortController.abort(options.abortSignal?.reason);
42
+ });
43
+ const queryRunner = normalizedOptions.queryRunner ?? ((input) => query(input));
44
+ const run = queryRunner({
45
+ options: {
46
+ allowDangerouslySkipPermissions: true,
47
+ abortController,
48
+ allowedTools: bridge.allowedTools,
49
+ cwd: normalizedOptions.cwd,
50
+ effort: normalizedOptions.effort,
51
+ env: normalizedOptions.env,
52
+ includePartialMessages: true,
53
+ maxTurns: normalizedOptions.maxTurns,
54
+ mcpServers: {
55
+ ...opencodeMcp.servers,
56
+ ...normalizedOptions.mcpServers,
57
+ ...bridge.mcpServers,
58
+ },
59
+ model: this.modelId,
60
+ pathToClaudeCodeExecutable: normalizedOptions.pathToClaudeCodeExecutable,
61
+ permissionMode: 'bypassPermissions',
62
+ resume: resumeSessionId,
63
+ systemPrompt: system
64
+ ? {
65
+ append: system,
66
+ preset: 'claude_code',
67
+ type: 'preset',
68
+ }
69
+ : {
70
+ preset: 'claude_code',
71
+ type: 'preset',
72
+ },
73
+ tools: bridge.nativeTools,
74
+ },
75
+ prompt,
76
+ });
77
+ const stream = new ReadableStream({
78
+ async start(controller) {
79
+ controller.enqueue({ type: 'stream-start', warnings: [] });
80
+ for (const warning of opencodeMcp.warnings) {
81
+ controller.enqueue({ error: new Error(warning), type: 'error' });
82
+ }
83
+ try {
84
+ for await (const message of run) {
85
+ const parts = mapSdkMessage(message, streamState);
86
+ for (const part of parts) {
87
+ controller.enqueue(part);
88
+ }
89
+ }
90
+ controller.enqueue({
91
+ finishReason: streamState.finishReason,
92
+ providerMetadata: buildProviderMetadata(currentModelId, streamState.sessionId),
93
+ type: 'finish',
94
+ usage: streamState.usage,
95
+ });
96
+ }
97
+ catch (error) {
98
+ controller.enqueue({ error, type: 'error' });
99
+ controller.enqueue({
100
+ finishReason: 'error',
101
+ providerMetadata: buildProviderMetadata(currentModelId, streamState.sessionId),
102
+ type: 'finish',
103
+ usage: streamState.usage,
104
+ });
105
+ }
106
+ finally {
107
+ run.close();
108
+ controller.close();
109
+ }
110
+ },
111
+ cancel() {
112
+ abortController.abort();
113
+ run.close();
114
+ },
115
+ });
116
+ return {
117
+ request: {
118
+ body: {
119
+ allowedTools: bridge.allowedTools,
120
+ model: this.modelId,
121
+ prompt,
122
+ resume: resumeSessionId,
123
+ system,
124
+ tools: bridge.nativeTools,
125
+ },
126
+ },
127
+ response: {
128
+ headers: {},
129
+ },
130
+ stream,
131
+ };
132
+ }
133
+ }
134
+ function buildProviderMetadata(modelId, sessionId) {
135
+ return {
136
+ 'claude-code': {
137
+ modelId,
138
+ ...(sessionId ? { sessionId } : {}),
139
+ },
140
+ };
141
+ }
142
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { LanguageModelV2Prompt } from '@ai-sdk/provider';
2
+ export declare function getSystem(prompt: LanguageModelV2Prompt): string;
3
+ export declare function buildPrompt(prompt: LanguageModelV2Prompt, options?: {
4
+ resumeSessionId?: string;
5
+ }): string;
6
+ export declare function getLatestUserText(prompt: LanguageModelV2Prompt): string | undefined;
7
+ export declare function loadClaudeMd(options: {
8
+ cwd: string;
9
+ explicitPath?: string;
10
+ loadClaudeMd?: boolean;
11
+ }): Promise<string | undefined>;
package/dist/prompt.js ADDED
@@ -0,0 +1,125 @@
1
+ import { access, readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ export function getSystem(prompt) {
4
+ return prompt
5
+ .filter((message) => message.role === 'system')
6
+ .map((message) => message.content)
7
+ .filter((content) => content.length > 0)
8
+ .join('\n\n')
9
+ .trim();
10
+ }
11
+ export function buildPrompt(prompt, options = {}) {
12
+ if (options.resumeSessionId) {
13
+ return getLatestUserText(prompt) ?? serializeConversation(prompt.slice(-1));
14
+ }
15
+ const sections = [];
16
+ const system = getSystem(prompt);
17
+ if (system) {
18
+ sections.push(['System instructions:', system].join('\n'));
19
+ }
20
+ const conversation = serializeConversation(prompt.filter((message) => message.role !== 'system'));
21
+ if (conversation) {
22
+ sections.push(['Conversation:', conversation].join('\n'));
23
+ }
24
+ return sections.join('\n\n').trim();
25
+ }
26
+ export function getLatestUserText(prompt) {
27
+ for (let index = prompt.length - 1; index >= 0; index -= 1) {
28
+ const message = prompt[index];
29
+ if (message.role !== 'user') {
30
+ continue;
31
+ }
32
+ const text = message.content
33
+ .map((part) => serializeUserPart(part))
34
+ .filter((value) => value.length > 0)
35
+ .join('\n')
36
+ .trim();
37
+ if (text) {
38
+ return text;
39
+ }
40
+ }
41
+ return undefined;
42
+ }
43
+ export async function loadClaudeMd(options) {
44
+ if (!options.loadClaudeMd) {
45
+ return undefined;
46
+ }
47
+ const filePath = options.explicitPath ?? join(options.cwd, 'CLAUDE.md');
48
+ try {
49
+ await access(filePath);
50
+ const content = await readFile(filePath, 'utf8');
51
+ const trimmed = content.trim();
52
+ return trimmed.length > 0 ? trimmed : undefined;
53
+ }
54
+ catch {
55
+ return undefined;
56
+ }
57
+ }
58
+ function serializeConversation(prompt) {
59
+ return prompt
60
+ .map((message) => {
61
+ if (message.role === 'system') {
62
+ return '';
63
+ }
64
+ if (message.role === 'user') {
65
+ return ['User:', ...message.content.map((part) => serializeUserPart(part)).filter(Boolean)].join('\n');
66
+ }
67
+ if (message.role === 'assistant') {
68
+ return ['Assistant:', ...message.content.map((part) => serializeAssistantPart(part)).filter(Boolean)].join('\n');
69
+ }
70
+ return ['Tool:', ...message.content.map((part) => serializeToolResultPart(part)).filter(Boolean)].join('\n');
71
+ })
72
+ .filter((section) => section.length > 0)
73
+ .join('\n\n')
74
+ .trim();
75
+ }
76
+ function serializeUserPart(part) {
77
+ if (part.type === 'text') {
78
+ return part.text;
79
+ }
80
+ return formatFilePart(part);
81
+ }
82
+ function serializeAssistantPart(part) {
83
+ if (part.type === 'text') {
84
+ return part.text;
85
+ }
86
+ if (part.type === 'reasoning') {
87
+ return `[reasoning]\n${part.text}`;
88
+ }
89
+ if (part.type === 'tool-call') {
90
+ return `[tool-call:${part.toolName}] ${safeJsonStringify(part.input)}`;
91
+ }
92
+ if (part.type === 'tool-result') {
93
+ return serializeToolResultPart(part);
94
+ }
95
+ return formatFilePart(part);
96
+ }
97
+ function serializeToolResultPart(part) {
98
+ return `[tool-result:${part.toolName}] ${safeJsonStringify(part.output)}`;
99
+ }
100
+ function safeJsonStringify(value) {
101
+ try {
102
+ return JSON.stringify(value, null, 2);
103
+ }
104
+ catch {
105
+ return String(value);
106
+ }
107
+ }
108
+ function formatFilePart(part) {
109
+ const fileName = part.filename ? ` filename=${part.filename}` : '';
110
+ const dataInfo = describeFileData(part.data);
111
+ return `[file mediaType=${part.mediaType}${fileName}${dataInfo ? ` ${dataInfo}` : ''}]`;
112
+ }
113
+ function describeFileData(data) {
114
+ if (data instanceof Uint8Array) {
115
+ return `bytes=${data.byteLength}`;
116
+ }
117
+ if (data instanceof URL) {
118
+ return `url=${data.toString()}`;
119
+ }
120
+ if (typeof data === 'string') {
121
+ return `stringLength=${data.length}`;
122
+ }
123
+ return '';
124
+ }
125
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { LanguageModelV2Prompt } from '@ai-sdk/provider';
2
+ export declare function getResume(prompt: LanguageModelV2Prompt, modelId: string): string | undefined;
package/dist/resume.js ADDED
@@ -0,0 +1,21 @@
1
+ import { isRecord } from './types.js';
2
+ export function getResume(prompt, modelId) {
3
+ for (let index = prompt.length - 1; index >= 0; index -= 1) {
4
+ const message = prompt[index];
5
+ const metadata = message.providerMetadata?.['claude-code'];
6
+ if (!isRecord(metadata)) {
7
+ continue;
8
+ }
9
+ const sessionId = typeof metadata.sessionId === 'string' ? metadata.sessionId : undefined;
10
+ const previousModelId = typeof metadata.modelId === 'string' ? metadata.modelId : undefined;
11
+ if (!sessionId) {
12
+ continue;
13
+ }
14
+ if (previousModelId && previousModelId !== modelId) {
15
+ return undefined;
16
+ }
17
+ return sessionId;
18
+ }
19
+ return undefined;
20
+ }
21
+ //# sourceMappingURL=resume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.js","sourceRoot":"","sources":["../src/resume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,MAAM,UAAU,SAAS,CAAC,MAA6B,EAAE,OAAe;IACtE,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAA8B,CAAC;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,aAAa,CAAC,CAAC;QAE3D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1F,MAAM,eAAe,GAAG,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAE5F,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QAED,IAAI,eAAe,IAAI,eAAe,KAAK,OAAO,EAAE,CAAC;YACnD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { z } from 'zod';
2
+ import type { JSONSchema7, JSONSchema7Definition } from '@ai-sdk/provider';
3
+ export declare function jsonSchemaToZodObjectShape(schema: JSONSchema7 | undefined): z.ZodRawShape | undefined;
4
+ export declare function jsonSchemaToZod(schema: JSONSchema7Definition | undefined): z.ZodTypeAny;
package/dist/schema.js ADDED
@@ -0,0 +1,57 @@
1
+ import { z } from 'zod';
2
+ import { isRecord } from './types.js';
3
+ export function jsonSchemaToZodObjectShape(schema) {
4
+ if (!schema || schema.type !== 'object' || !isRecord(schema.properties)) {
5
+ return undefined;
6
+ }
7
+ const required = new Set(Array.isArray(schema.required) ? schema.required : []);
8
+ const shape = Object.fromEntries(Object.entries(schema.properties).map(([key, value]) => {
9
+ const zodSchema = jsonSchemaToZod(value);
10
+ return [key, required.has(key) ? zodSchema : zodSchema.optional()];
11
+ }));
12
+ return shape;
13
+ }
14
+ export function jsonSchemaToZod(schema) {
15
+ if (!schema || typeof schema === 'boolean') {
16
+ return z.unknown();
17
+ }
18
+ if (Array.isArray(schema.type)) {
19
+ return jsonSchemaToZod({ ...schema, type: schema.type[0] });
20
+ }
21
+ if (schema.enum) {
22
+ const enumValues = schema.enum.filter((value) => value !== undefined);
23
+ if (enumValues.length > 0) {
24
+ const [firstLiteral, ...restLiterals] = enumValues.map((value) => z.literal(value));
25
+ return restLiterals.length > 0 ? z.union([firstLiteral, ...restLiterals]) : firstLiteral;
26
+ }
27
+ }
28
+ switch (schema.type) {
29
+ case 'array': {
30
+ const items = Array.isArray(schema.items) ? schema.items[0] : schema.items;
31
+ return z.array(jsonSchemaToZod(items));
32
+ }
33
+ case 'boolean': {
34
+ return z.boolean();
35
+ }
36
+ case 'integer': {
37
+ return z.number().int();
38
+ }
39
+ case 'number': {
40
+ return z.number();
41
+ }
42
+ case 'object': {
43
+ return z.object(jsonSchemaToZodObjectShape(schema) ?? {}).passthrough();
44
+ }
45
+ case 'string': {
46
+ const format = schema.format;
47
+ if (format === 'uri' || format === 'url') {
48
+ return z.string().url();
49
+ }
50
+ return z.string();
51
+ }
52
+ default: {
53
+ return z.unknown();
54
+ }
55
+ }
56
+ }
57
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import type { LanguageModelV2FunctionTool, LanguageModelV2Prompt } from '@ai-sdk/provider';
2
+ import type { McpServerConfig, Options, SDKMessage } from '@anthropic-ai/claude-agent-sdk';
3
+ export declare const DEFAULT_NATIVE_TOOLS: readonly ["bash", "read", "write", "edit", "glob", "grep"];
4
+ export declare const DEFAULT_BRIDGE_TOOLS: readonly ["question", "task", "todowrite", "webfetch", "websearch", "oc_websearch", "oc_apply_patch", "oc_codesearch"];
5
+ export declare const DEFAULT_MAX_TURNS = 12;
6
+ export declare const DEFAULT_EXECUTABLE_PATH = "claude";
7
+ export type ClaudeCodeEffort = 'low' | 'medium' | 'high' | 'max';
8
+ export type OpenCodeLocalMcpConfig = {
9
+ enabled?: boolean;
10
+ type: 'local';
11
+ command: string[];
12
+ environment?: Record<string, string>;
13
+ };
14
+ export type OpenCodeRemoteMcpConfig = {
15
+ enabled?: boolean;
16
+ type: 'remote';
17
+ url: string;
18
+ headers?: Record<string, string>;
19
+ oauth?: Record<string, string> | boolean;
20
+ transport?: 'http' | 'sse';
21
+ };
22
+ export type OpenCodeMcpConfig = Record<string, OpenCodeLocalMcpConfig | OpenCodeRemoteMcpConfig>;
23
+ export type ProviderMetadataValue = {
24
+ modelId?: string;
25
+ sessionId?: string;
26
+ };
27
+ export type ToolExecuteContext = {
28
+ abortSignal?: AbortSignal;
29
+ messages: LanguageModelV2Prompt;
30
+ toolCallId: string;
31
+ };
32
+ export type OpenCodeToolLike = LanguageModelV2FunctionTool & {
33
+ execute?: (args: unknown, context: ToolExecuteContext) => Promise<unknown>;
34
+ };
35
+ export type QueryLike = AsyncIterable<SDKMessage> & {
36
+ close(): void;
37
+ };
38
+ export type QueryRunner = (input: {
39
+ options?: Options;
40
+ prompt: string;
41
+ }) => QueryLike;
42
+ export type ClaudeCodeProviderOptions = {
43
+ bridgeOpenCodeMcp?: boolean;
44
+ bridgeTools?: string[];
45
+ claudeMdPath?: string;
46
+ cwd?: string;
47
+ env?: Record<string, string>;
48
+ effort?: ClaudeCodeEffort;
49
+ loadClaudeMd?: boolean;
50
+ maxTurns?: number;
51
+ mcpServers?: Record<string, McpServerConfig>;
52
+ nativeTools?: string[];
53
+ openCodeMcp?: OpenCodeMcpConfig;
54
+ pathToClaudeCodeExecutable?: string;
55
+ queryRunner?: QueryRunner;
56
+ settingSources?: string[];
57
+ };
58
+ export type NormalizedClaudeCodeOptions = {
59
+ bridgeOpenCodeMcp: boolean;
60
+ bridgeTools: string[];
61
+ claudeMdPath?: string;
62
+ cwd: string;
63
+ env: Record<string, string>;
64
+ effort?: ClaudeCodeEffort;
65
+ loadClaudeMd: boolean;
66
+ maxTurns: number;
67
+ mcpServers: Record<string, McpServerConfig>;
68
+ nativeTools: string[];
69
+ openCodeMcp?: OpenCodeMcpConfig;
70
+ pathToClaudeCodeExecutable: string;
71
+ queryRunner?: QueryRunner;
72
+ settingSources: string[];
73
+ };
74
+ export type BridgeContext = {
75
+ abortSignal?: AbortSignal;
76
+ bridgeTools?: string[];
77
+ nativeTools?: string[];
78
+ prompt: LanguageModelV2Prompt;
79
+ tools: unknown;
80
+ };
81
+ export declare function normalizeProviderOptions(rawOptions: Record<string, unknown> | undefined, defaults: ClaudeCodeProviderOptions): NormalizedClaudeCodeOptions;
82
+ export declare function getString(value: unknown): string | undefined;
83
+ export declare function getBoolean(value: unknown): boolean | undefined;
84
+ export declare function getNumber(value: unknown): number | undefined;
85
+ export declare function getStringArray(value: unknown): string[] | undefined;
86
+ export declare function getRecord<T>(value: unknown): Record<string, T> | undefined;
87
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
package/dist/types.js ADDED
@@ -0,0 +1,83 @@
1
+ export const DEFAULT_NATIVE_TOOLS = ['bash', 'read', 'write', 'edit', 'glob', 'grep'];
2
+ export const DEFAULT_BRIDGE_TOOLS = [
3
+ 'question',
4
+ 'task',
5
+ 'todowrite',
6
+ 'webfetch',
7
+ 'websearch',
8
+ 'oc_websearch',
9
+ 'oc_apply_patch',
10
+ 'oc_codesearch',
11
+ ];
12
+ export const DEFAULT_MAX_TURNS = 12;
13
+ export const DEFAULT_EXECUTABLE_PATH = 'claude';
14
+ export function normalizeProviderOptions(rawOptions, defaults) {
15
+ const raw = rawOptions ?? {};
16
+ const rawEnv = isStringRecord(raw.env) ? raw.env : undefined;
17
+ return {
18
+ bridgeOpenCodeMcp: getBoolean(raw.bridgeOpenCodeMcp) ?? defaults.bridgeOpenCodeMcp ?? false,
19
+ bridgeTools: getStringArray(raw.bridgeTools) ?? defaults.bridgeTools ?? [...DEFAULT_BRIDGE_TOOLS],
20
+ claudeMdPath: getString(raw.claudeMdPath) ?? defaults.claudeMdPath,
21
+ cwd: getString(raw.cwd) ?? defaults.cwd ?? process.cwd(),
22
+ env: {
23
+ ...(defaults.env ?? {}),
24
+ ...(rawEnv ?? {}),
25
+ },
26
+ effort: getEffort(raw.effort) ?? defaults.effort,
27
+ loadClaudeMd: getBoolean(raw.loadClaudeMd) ?? defaults.loadClaudeMd ?? false,
28
+ maxTurns: getNumber(raw.maxTurns) ?? defaults.maxTurns ?? DEFAULT_MAX_TURNS,
29
+ mcpServers: getRecord(raw.mcpServers) ?? defaults.mcpServers ?? {},
30
+ nativeTools: getStringArray(raw.nativeTools) ?? defaults.nativeTools ?? [...DEFAULT_NATIVE_TOOLS],
31
+ openCodeMcp: getRecord(raw.openCodeMcp) ?? defaults.openCodeMcp,
32
+ pathToClaudeCodeExecutable: getString(raw.pathToClaudeCodeExecutable) ?? defaults.pathToClaudeCodeExecutable ?? DEFAULT_EXECUTABLE_PATH,
33
+ queryRunner: defaults.queryRunner,
34
+ settingSources: getStringArray(raw.settingSources) ?? defaults.settingSources ?? [],
35
+ };
36
+ }
37
+ export function getString(value) {
38
+ if (typeof value === 'string' && value.length > 0) {
39
+ return value;
40
+ }
41
+ return undefined;
42
+ }
43
+ export function getBoolean(value) {
44
+ if (typeof value === 'boolean') {
45
+ return value;
46
+ }
47
+ return undefined;
48
+ }
49
+ export function getNumber(value) {
50
+ if (typeof value === 'number' && Number.isFinite(value)) {
51
+ return value;
52
+ }
53
+ return undefined;
54
+ }
55
+ export function getStringArray(value) {
56
+ if (!Array.isArray(value)) {
57
+ return undefined;
58
+ }
59
+ const next = value.filter((item) => typeof item === 'string' && item.length > 0);
60
+ return next.length > 0 ? next : [];
61
+ }
62
+ export function getRecord(value) {
63
+ if (!isRecord(value)) {
64
+ return undefined;
65
+ }
66
+ return value;
67
+ }
68
+ export function isRecord(value) {
69
+ return typeof value === 'object' && value !== null;
70
+ }
71
+ function isStringRecord(value) {
72
+ if (!isRecord(value)) {
73
+ return false;
74
+ }
75
+ return Object.values(value).every((item) => typeof item === 'string');
76
+ }
77
+ function getEffort(value) {
78
+ if (value === 'low' || value === 'medium' || value === 'high' || value === 'max') {
79
+ return value;
80
+ }
81
+ return undefined;
82
+ }
83
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAC/F,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,UAAU;IACV,MAAM;IACN,WAAW;IACX,UAAU;IACV,WAAW;IACX,cAAc;IACd,gBAAgB;IAChB,eAAe;CACP,CAAC;AACX,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAqFhD,MAAM,UAAU,wBAAwB,CACtC,UAA+C,EAC/C,QAAmC;IAEnC,MAAM,GAAG,GAAG,UAAU,IAAI,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7D,OAAO;QACL,iBAAiB,EAAE,UAAU,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,iBAAiB,IAAI,KAAK;QAC3F,WAAW,EAAE,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,WAAW,IAAI,CAAC,GAAG,oBAAoB,CAAC;QACjG,YAAY,EAAE,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,YAAY;QAClE,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;QACxD,GAAG,EAAE;YACH,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC;YACvB,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;SAClB;QACD,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM;QAChD,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,YAAY,IAAI,KAAK;QAC5E,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,IAAI,iBAAiB;QAC3E,UAAU,EAAE,SAAS,CAAkB,GAAG,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,UAAU,IAAI,EAAE;QACnF,WAAW,EAAE,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,WAAW,IAAI,CAAC,GAAG,oBAAoB,CAAC;QACjG,WAAW,EAAE,SAAS,CAAmD,GAAG,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,WAAW;QACjH,0BAA0B,EAAE,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC,IAAI,QAAQ,CAAC,0BAA0B,IAAI,uBAAuB;QACvI,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC,cAAc,IAAI,EAAE;KACpF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEjG,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,SAAS,CAAI,KAAc;IACzC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,KAA0B,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACjF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@seonggukchoi/opencode-claude-code-provider",
3
+ "version": "0.1.0",
4
+ "description": "OpenCode provider backed by Claude Agent SDK",
5
+ "author": "seonggukchoi",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "engineStrict": true,
9
+ "engines": {
10
+ "node": ">=24.0.0"
11
+ },
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/seonggukchoi/packages.js",
18
+ "directory": "packages/opencode-claude-code-provider"
19
+ },
20
+ "keywords": [
21
+ "opencode",
22
+ "claude",
23
+ "provider",
24
+ "anthropic",
25
+ "ai-sdk"
26
+ ],
27
+ "main": "dist/index.js",
28
+ "types": "dist/index.d.ts",
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "import": "./dist/index.js"
33
+ }
34
+ },
35
+ "files": [
36
+ "dist"
37
+ ],
38
+ "scripts": {
39
+ "build": "rimraf dist .tsbuildinfo && tsc -p tsconfig.build.json",
40
+ "lint": "eslint --fix .",
41
+ "test": "vitest run",
42
+ "test:coverage": "vitest run --coverage",
43
+ "test:smoke": "node ./test/smoke.mjs",
44
+ "test:typecheck": "tsc -p tsconfig.check.json --noEmit",
45
+ "typecheck": "pnpm run test:typecheck"
46
+ },
47
+ "peerDependencies": {
48
+ "@ai-sdk/provider": ">=3.0.0",
49
+ "zod": ">=4.0.0"
50
+ },
51
+ "dependencies": {
52
+ "@ai-sdk/provider": "^3.0.8",
53
+ "@anthropic-ai/claude-agent-sdk": "^0.2.81",
54
+ "zod": "^4.1.8"
55
+ },
56
+ "devDependencies": {
57
+ "@types/node": "^24.9.1"
58
+ },
59
+ "gitHead": "c895ebf9155327c6aa5cdd978f948011e0f21f6b"
60
+ }