nim-sync 1.0.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.
@@ -0,0 +1,366 @@
1
+ import crypto from 'crypto';
2
+ import path from 'path';
3
+ import { NVIDIAApiError } from '../types/index.js';
4
+ import { validateOpenCodeConfig } from '../types/schema.js';
5
+ import { withRetry } from '../lib/retry.js';
6
+ import { readJSONC, writeJSONC, updateJSONCPath, acquireLock, getConfigDir, getCacheDir, getDataDir, API_TIMEOUT_MS, CACHE_TTL_MS, MIN_MANUAL_REFRESH_INTERVAL_MS } from '../lib/file-utils.js';
7
+ const NIM_BASE_URL = 'https://integrate.api.nvidia.com/v1';
8
+ const CACHE_FILE_NAME = 'nim-sync-cache.json';
9
+ const CONFIG_FILE_NAME = 'opencode.jsonc';
10
+ const ALLOWED_MODEL_PROPERTIES = new Set([
11
+ 'id', 'name', 'description', 'model_type', 'quantization',
12
+ 'created', 'owned_by', 'object', 'root', 'parent', 'permission'
13
+ ]);
14
+ /**
15
+ * Creates a NVIDIA NIM model synchronization plugin for OpenCode.
16
+ *
17
+ * This plugin automatically fetches available models from NVIDIA's API and updates
18
+ * the OpenCode configuration with the latest model list. It provides:
19
+ * - Automatic sync on startup with 24-hour TTL caching
20
+ * - Manual refresh via `/nim-refresh` command with rate limiting (60s cooldown)
21
+ * - Atomic file operations with lock-based concurrency control
22
+ * - Graceful error handling with user-friendly toast notifications
23
+ *
24
+ * @param api - Plugin API provided by OpenCode framework
25
+ * @returns Plugin instance with lifecycle methods and exposed utilities
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * // Plugin is automatically loaded by OpenCode
30
+ * const plugin = await syncNIMModels(api)
31
+ * await plugin.init?.()
32
+ *
33
+ * // Manual refresh via command
34
+ * await plugin.refreshModels?.(true)
35
+ * ```
36
+ *
37
+ * @remarks
38
+ * - Requires NVIDIA API key in `auth.json` or `NVIDIA_API_KEY` environment variable
39
+ * - Updates `provider.nim.models` in `opencode.jsonc`
40
+ * - Cache stored in `nim-sync-cache.json` with 24-hour TTL
41
+ * - Prevents concurrent refreshes with in-memory flag
42
+ */
43
+ export async function syncNIMModels(api) {
44
+ let refreshInProgress = false;
45
+ let lastManualRefresh = 0;
46
+ const safeShowToast = (options) => {
47
+ try {
48
+ api.tui.toast.show(options);
49
+ }
50
+ catch (e) {
51
+ console.debug('[NIM-Sync] Toast display failed:', e instanceof Error ? e.message : 'Unknown');
52
+ }
53
+ };
54
+ const sanitizeErrorMessage = (msg, apiKey) => {
55
+ if (!apiKey)
56
+ return msg;
57
+ return msg.replace(apiKey, '[REDACTED]');
58
+ };
59
+ const getCachePath = () => path.join(getCacheDir(), CACHE_FILE_NAME);
60
+ const getConfigPath = () => path.join(getConfigDir(), CONFIG_FILE_NAME);
61
+ const getAuthPath = () => path.join(getDataDir(), 'auth.json');
62
+ const readCache = async () => {
63
+ try {
64
+ const cache = await readJSONC(getCachePath());
65
+ return cache?.lastRefresh ? cache : null;
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ };
71
+ const writeCache = async (cache) => {
72
+ let releaseLockFn = null;
73
+ try {
74
+ releaseLockFn = await acquireLock('nim-cache-write');
75
+ }
76
+ catch (lockError) {
77
+ const msg = lockError instanceof Error ? lockError.message : 'Unknown error';
78
+ console.error('[NIM-Sync] Cache lock failed:', msg);
79
+ safeShowToast({ title: 'NVIDIA Sync Warning', description: 'Cache lock failed: ' + msg, variant: 'error' });
80
+ throw lockError;
81
+ }
82
+ try {
83
+ await writeJSONC(getCachePath(), cache, { backup: true });
84
+ }
85
+ catch (writeError) {
86
+ const msg = writeError instanceof Error ? writeError.message : 'Unknown error';
87
+ console.error('[NIM-Sync] Cache write failed:', msg);
88
+ safeShowToast({ title: 'NVIDIA Sync Failed', description: 'Failed to write cache: ' + msg, variant: 'error' });
89
+ throw writeError;
90
+ }
91
+ finally {
92
+ if (releaseLockFn) {
93
+ try {
94
+ await releaseLockFn();
95
+ }
96
+ catch (e) {
97
+ console.error('[NIM-Sync] Failed to release cache lock:', e);
98
+ }
99
+ }
100
+ }
101
+ };
102
+ const getAPIKey = async () => {
103
+ // Priority order:
104
+ // 1. First check auth.json -> credentials.nim.apiKey
105
+ // 2. Fallback to NVIDIA_API_KEY environment variable
106
+ // 3. Return null if neither is available
107
+ try {
108
+ const auth = await readJSONC(getAuthPath());
109
+ if (!auth || Object.keys(auth).length === 0) {
110
+ console.debug('[NIM-Sync] No auth.json found, checking env var');
111
+ return process.env.NVIDIA_API_KEY || null;
112
+ }
113
+ if (auth.credentials?.nim?.apiKey && typeof auth.credentials.nim.apiKey === 'string') {
114
+ return auth.credentials.nim.apiKey;
115
+ }
116
+ console.debug('[NIM-Sync] No credentials in auth.json, checking env var');
117
+ return process.env.NVIDIA_API_KEY || null;
118
+ }
119
+ catch (error) {
120
+ console.error('[NIM-Sync] Failed to read auth:', error instanceof Error ? error.message : 'Unknown error');
121
+ return process.env.NVIDIA_API_KEY || null;
122
+ }
123
+ };
124
+ const exposedGetAPIKey = getAPIKey;
125
+ function validateAPIResponse(response) {
126
+ if (!response || typeof response !== 'object')
127
+ throw new Error('Invalid API response: Expected object, got ' + (response === null ? 'null' : typeof response));
128
+ const obj = response;
129
+ if (!('data' in obj))
130
+ throw new Error('Invalid API response: Missing data field. Keys: [' + Object.keys(obj).join(', ') + ']');
131
+ const data = obj.data;
132
+ if (!Array.isArray(data))
133
+ throw new Error('Invalid API response: data must be array, got ' + typeof data);
134
+ const seenIds = new Set();
135
+ const models = [];
136
+ for (let i = 0; i < data.length; i++) {
137
+ const m = data[i];
138
+ if (!m || typeof m !== 'object')
139
+ throw new Error('Invalid model at index ' + i + ': not an object');
140
+ if (typeof m.id !== 'string' || m.id.length === 0)
141
+ throw new Error('Invalid model at index ' + i + ': invalid id');
142
+ if (typeof m.name !== 'string' || m.name.length === 0)
143
+ throw new Error('Model ' + m.id + ': invalid name');
144
+ if (seenIds.has(m.id))
145
+ throw new Error('Duplicate model ID: ' + m.id);
146
+ const unexpected = Object.keys(m).filter(k => !ALLOWED_MODEL_PROPERTIES.has(k));
147
+ if (unexpected.length > 0)
148
+ console.warn('[NIM-Sync] Model ' + m.id + ' has unexpected props: [' + unexpected.join(', ') + ']');
149
+ seenIds.add(m.id);
150
+ models.push({
151
+ id: m.id, name: m.name,
152
+ description: typeof m.description === 'string' ? m.description : undefined,
153
+ model_type: typeof m.model_type === 'string' ? m.model_type : undefined,
154
+ quantization: typeof m.quantization === 'string' ? m.quantization : undefined
155
+ });
156
+ }
157
+ return models;
158
+ }
159
+ const fetchModels = async (apiKey) => {
160
+ return withRetry(async () => {
161
+ const controller = new AbortController();
162
+ const timeoutId = setTimeout(() => controller.abort(), API_TIMEOUT_MS);
163
+ try {
164
+ const response = await fetch(NIM_BASE_URL + '/models', {
165
+ headers: { 'Authorization': 'Bearer ' + apiKey, 'Content-Type': 'application/json' },
166
+ signal: controller.signal
167
+ });
168
+ clearTimeout(timeoutId);
169
+ if (!response.ok)
170
+ throw new NVIDIAApiError(response.status, response.statusText);
171
+ let data;
172
+ try {
173
+ data = await response.json();
174
+ }
175
+ catch (e) {
176
+ throw new Error('Failed to parse JSON: ' + (e instanceof Error ? e.message : 'Unknown'));
177
+ }
178
+ return validateAPIResponse(data);
179
+ }
180
+ catch (error) {
181
+ clearTimeout(timeoutId);
182
+ if (error instanceof Error && error.name === 'AbortError')
183
+ throw new Error('NVIDIA API request timed out after ' + (API_TIMEOUT_MS / 1000) + ' seconds');
184
+ throw error;
185
+ }
186
+ }, { maxRetries: 3, initialDelay: 1000, maxDelay: 10000, retryStatusCodes: [429, 500, 502, 503, 504] });
187
+ };
188
+ const hashModels = (models) => {
189
+ const hash = crypto.createHash('sha256');
190
+ hash.update(JSON.stringify([...models].sort((a, b) => a.id.localeCompare(b.id))));
191
+ return hash.digest('hex');
192
+ };
193
+ const sortKeysDeep = (value) => {
194
+ if (Array.isArray(value)) {
195
+ return value.map(sortKeysDeep);
196
+ }
197
+ if (value && typeof value === 'object') {
198
+ return Object.keys(value)
199
+ .sort()
200
+ .reduce((acc, key) => {
201
+ acc[key] = sortKeysDeep(value[key]);
202
+ return acc;
203
+ }, {});
204
+ }
205
+ return value;
206
+ };
207
+ const managedNIMConfigMatches = (currentConfig, nextConfig) => {
208
+ return JSON.stringify(sortKeysDeep(currentConfig ?? null)) === JSON.stringify(sortKeysDeep(nextConfig));
209
+ };
210
+ const shouldRefresh = async () => {
211
+ try {
212
+ const config = api.config.get();
213
+ if (!config?.provider?.nim)
214
+ return true;
215
+ const cache = await readCache();
216
+ if (!cache?.lastRefresh)
217
+ return true;
218
+ return Date.now() - cache.lastRefresh > CACHE_TTL_MS;
219
+ }
220
+ catch {
221
+ return true;
222
+ }
223
+ };
224
+ const exposedShouldRefresh = shouldRefresh;
225
+ const updateConfig = async (models) => {
226
+ const config = await readJSONC(getConfigPath());
227
+ const newModels = models.reduce((acc, m) => {
228
+ acc[m.id] = { name: m.name, options: config?.provider?.nim?.models?.[m.id]?.options || {} };
229
+ return acc;
230
+ }, {});
231
+ const modelsHash = hashModels(models);
232
+ const cache = await readCache();
233
+ const updatedNIMConfig = {
234
+ ...config?.provider?.nim,
235
+ npm: '@ai-sdk/openai-compatible',
236
+ name: 'NVIDIA NIM',
237
+ options: {
238
+ ...config?.provider?.nim?.options,
239
+ baseURL: NIM_BASE_URL
240
+ },
241
+ models: newModels
242
+ };
243
+ const managedConfigChanged = !managedNIMConfigMatches(config?.provider?.nim, updatedNIMConfig);
244
+ if (cache?.modelsHash === modelsHash && !managedConfigChanged) {
245
+ try {
246
+ await writeCache({ ...cache, lastRefresh: Date.now(), modelsHash, baseURL: NIM_BASE_URL });
247
+ }
248
+ catch { /* non-fatal */ }
249
+ return false;
250
+ }
251
+ let releaseLockFn = null;
252
+ try {
253
+ releaseLockFn = await acquireLock('nim-config-update');
254
+ }
255
+ catch (e) {
256
+ const msg = e instanceof Error ? e.message : 'Unknown';
257
+ console.error('[NIM-Sync] Config lock failed:', msg);
258
+ safeShowToast({ title: 'NVIDIA Config Lock Failed', description: msg, variant: 'error' });
259
+ throw e;
260
+ }
261
+ try {
262
+ const updatedConfig = {
263
+ ...(config || {}),
264
+ provider: { ...config?.provider, nim: updatedNIMConfig }
265
+ };
266
+ const validation = validateOpenCodeConfig(updatedConfig);
267
+ if (!validation.valid) {
268
+ console.warn('[NIM-Sync] Config validation warnings:', validation.errors);
269
+ }
270
+ await updateJSONCPath(getConfigPath(), ['provider', 'nim'], updatedNIMConfig, { backup: true, createBackupDir: true });
271
+ try {
272
+ await writeCache({ lastRefresh: Date.now(), modelsHash, baseURL: NIM_BASE_URL });
273
+ }
274
+ catch { /* non-fatal */ }
275
+ return true;
276
+ }
277
+ catch (e) {
278
+ const msg = e instanceof Error ? e.message : 'Unknown';
279
+ console.error('[NIM-Sync] Config update failed:', msg);
280
+ safeShowToast({ title: 'NVIDIA Config Update Failed', description: msg, variant: 'error' });
281
+ throw e;
282
+ }
283
+ finally {
284
+ if (releaseLockFn) {
285
+ try {
286
+ await releaseLockFn();
287
+ }
288
+ catch (e) {
289
+ console.error('[NIM-Sync] Failed to release config lock:', e);
290
+ }
291
+ }
292
+ }
293
+ };
294
+ const exposedUpdateConfig = updateConfig;
295
+ const refreshModels = async (force = false) => {
296
+ if (refreshInProgress)
297
+ return;
298
+ refreshInProgress = true;
299
+ let apiKey = null;
300
+ try {
301
+ if (!force && !(await shouldRefresh()))
302
+ return;
303
+ apiKey = await getAPIKey();
304
+ if (!apiKey) {
305
+ safeShowToast({ title: 'NVIDIA API Key Required', description: 'Run /connect to add your NVIDIA API key', variant: 'error' });
306
+ return;
307
+ }
308
+ const models = await fetchModels(apiKey);
309
+ if (models.length === 0) {
310
+ safeShowToast({ title: 'No Models Available', description: 'NVIDIA API returned no models.', variant: 'error' });
311
+ return;
312
+ }
313
+ const changed = await updateConfig(models);
314
+ if (changed)
315
+ safeShowToast({ title: 'NVIDIA NIM Models Updated', description: models.length + ' models synchronized', variant: 'success' });
316
+ }
317
+ catch (error) {
318
+ const msg = sanitizeErrorMessage(error instanceof Error ? error.message : 'Unknown error', apiKey);
319
+ console.error('[NIM-Sync] Model refresh failed:', msg);
320
+ safeShowToast({ title: 'NVIDIA Sync Failed', description: msg, variant: 'error' });
321
+ try {
322
+ await writeCache({ modelsHash: '', lastError: msg, baseURL: NIM_BASE_URL });
323
+ }
324
+ catch { /* ignore */ }
325
+ }
326
+ finally {
327
+ refreshInProgress = false;
328
+ }
329
+ };
330
+ const init = async () => {
331
+ try {
332
+ api.command.register('nim-refresh', async () => {
333
+ const now = Date.now();
334
+ if (now - lastManualRefresh < MIN_MANUAL_REFRESH_INTERVAL_MS) {
335
+ const remainingSeconds = Math.ceil((MIN_MANUAL_REFRESH_INTERVAL_MS - (now - lastManualRefresh)) / 1000);
336
+ safeShowToast({ title: 'Rate Limited', description: 'Please wait ' + remainingSeconds + 's before refreshing again', variant: 'default' });
337
+ return;
338
+ }
339
+ lastManualRefresh = now;
340
+ await refreshModels(true);
341
+ }, { description: 'Force refresh NVIDIA NIM models' });
342
+ }
343
+ catch (e) {
344
+ console.error('[NIM-Sync] Failed to register command:', e);
345
+ }
346
+ void refreshModels().catch((e) => { console.error('[NIM-Sync] Init failed:', e); });
347
+ };
348
+ const hooks = {
349
+ 'server.connected': async () => { try {
350
+ await refreshModels();
351
+ }
352
+ catch (e) {
353
+ console.error('[NIM-Sync] Hook failed:', e);
354
+ } },
355
+ 'session.created': async () => { try {
356
+ await refreshModels();
357
+ }
358
+ catch (e) {
359
+ console.error('[NIM-Sync] Hook failed:', e);
360
+ } }
361
+ };
362
+ const exposedRefreshModels = refreshModels;
363
+ return { init, hooks, getAPIKey: exposedGetAPIKey, updateConfig: exposedUpdateConfig, refreshModels: exposedRefreshModels, shouldRefresh: exposedShouldRefresh };
364
+ }
365
+ export default syncNIMModels;
366
+ //# sourceMappingURL=nim-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nim-sync.js","sourceRoot":"","sources":["../../src/plugin/nim-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ export interface NIMModel {
2
+ id: string;
3
+ name: string;
4
+ description?: string;
5
+ model_type?: string;
6
+ quantization?: string;
7
+ }
8
+ export interface NIMApiResponse {
9
+ data: NIMModel[];
10
+ }
11
+ export interface AuthConfig {
12
+ credentials?: {
13
+ nim?: {
14
+ apiKey?: string;
15
+ };
16
+ };
17
+ }
18
+ export interface LockMetadata {
19
+ pid: number;
20
+ timestamp: number;
21
+ }
22
+ export interface OpenCodeConfig {
23
+ $schema?: string;
24
+ provider?: {
25
+ nim?: {
26
+ npm?: string;
27
+ name?: string;
28
+ options?: {
29
+ baseURL?: string;
30
+ };
31
+ models?: Record<string, {
32
+ name: string;
33
+ options?: Record<string, unknown>;
34
+ }>;
35
+ };
36
+ };
37
+ model?: string;
38
+ small_model?: string;
39
+ [key: string]: unknown;
40
+ }
41
+ export interface CacheData {
42
+ lastRefresh?: number;
43
+ modelsHash: string;
44
+ lastError?: string;
45
+ baseURL?: string;
46
+ }
47
+ export interface PluginAPI {
48
+ config: {
49
+ get: <T = unknown>(key?: string) => T;
50
+ set: (key: string, value: unknown) => Promise<void>;
51
+ };
52
+ tui: {
53
+ toast: {
54
+ show: (options: {
55
+ title: string;
56
+ description?: string;
57
+ variant?: 'default' | 'destructive' | 'success' | 'error';
58
+ }) => void;
59
+ };
60
+ };
61
+ command: {
62
+ register: (name: string, handler: () => Promise<void> | void, options?: {
63
+ description: string;
64
+ }) => void;
65
+ execute: (name: string) => Promise<void>;
66
+ };
67
+ client?: {
68
+ app: {
69
+ log: (log: {
70
+ body: {
71
+ service: string;
72
+ level: 'debug' | 'info' | 'warn' | 'error';
73
+ message: string;
74
+ extra?: Record<string, unknown>;
75
+ };
76
+ }) => Promise<void>;
77
+ };
78
+ };
79
+ }
80
+ export type Plugin = (api: PluginAPI) => Promise<{
81
+ init?: () => Promise<void>;
82
+ [key: string]: unknown;
83
+ }> | {
84
+ init?: () => Promise<void>;
85
+ [key: string]: unknown;
86
+ };
87
+ /**
88
+ * Custom error for NVIDIA API failures.
89
+ */
90
+ export declare class NVIDIAApiError extends Error {
91
+ statusCode: number;
92
+ statusText: string;
93
+ constructor(statusCode: number, statusText: string);
94
+ }
95
+ /**
96
+ * Platform-specific directory paths for OpenCode.
97
+ */
98
+ export interface PlatformPaths {
99
+ config: string;
100
+ data: string;
101
+ cache: string;
102
+ }
103
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Custom error for NVIDIA API failures.
3
+ */
4
+ export class NVIDIAApiError extends Error {
5
+ statusCode;
6
+ statusText;
7
+ constructor(statusCode, statusText) {
8
+ super(`NVIDIA API error: ${statusCode} ${statusText}`);
9
+ this.statusCode = statusCode;
10
+ this.statusText = statusText;
11
+ this.name = 'NVIDIAApiError';
12
+ }
13
+ }
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAkFA;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAE9B;IACA;IAFT,YACS,UAAkB,EAClB,UAAkB;QAEzB,KAAK,CAAC,qBAAqB,UAAU,IAAI,UAAU,EAAE,CAAC,CAAA;QAH/C,eAAU,GAAV,UAAU,CAAQ;QAClB,eAAU,GAAV,UAAU,CAAQ;QAGzB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;IAC9B,CAAC;CACF"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * JSON Schema for OpenCode configuration validation.
3
+ * Validates the structure of opencode.jsonc files.
4
+ */
5
+ export declare const OpenCodeConfigSchema: {
6
+ readonly $schema: "http://json-schema.org/draft-07/schema#";
7
+ readonly $id: "https://opencode.ai/schemas/opencode-config";
8
+ readonly title: "OpenCode Configuration";
9
+ readonly description: "Configuration schema for OpenCode plugins";
10
+ readonly type: "object";
11
+ readonly additionalProperties: true;
12
+ readonly properties: {
13
+ readonly $schema: {
14
+ readonly type: "string";
15
+ readonly description: "JSON Schema URI";
16
+ };
17
+ readonly provider: {
18
+ readonly type: "object";
19
+ readonly additionalProperties: true;
20
+ readonly description: "AI provider configurations";
21
+ readonly properties: {
22
+ readonly nim: {
23
+ readonly type: "object";
24
+ readonly description: "NVIDIA NIM provider configuration";
25
+ readonly properties: {
26
+ readonly npm: {
27
+ readonly type: "string";
28
+ readonly description: "NPM package name for the provider";
29
+ };
30
+ readonly name: {
31
+ readonly type: "string";
32
+ readonly description: "Display name for the provider";
33
+ };
34
+ readonly options: {
35
+ readonly type: "object";
36
+ readonly additionalProperties: true;
37
+ readonly description: "Provider-specific options";
38
+ readonly properties: {
39
+ readonly baseURL: {
40
+ readonly type: "string";
41
+ readonly format: "uri";
42
+ readonly description: "Base URL for the API";
43
+ };
44
+ };
45
+ };
46
+ readonly models: {
47
+ readonly type: "object";
48
+ readonly additionalProperties: {
49
+ readonly type: "object";
50
+ readonly properties: {
51
+ readonly name: {
52
+ readonly type: "string";
53
+ readonly description: "Model display name";
54
+ };
55
+ readonly options: {
56
+ readonly type: "object";
57
+ readonly additionalProperties: true;
58
+ readonly description: "Model-specific options";
59
+ };
60
+ };
61
+ readonly required: readonly ["name"];
62
+ readonly additionalProperties: false;
63
+ };
64
+ readonly description: "Available models for this provider";
65
+ };
66
+ };
67
+ readonly required: readonly ["npm", "name"];
68
+ readonly additionalProperties: false;
69
+ };
70
+ };
71
+ };
72
+ readonly model: {
73
+ readonly type: "string";
74
+ readonly description: "Default model to use";
75
+ };
76
+ readonly small_model: {
77
+ readonly type: "string";
78
+ readonly description: "Small model for lightweight tasks";
79
+ };
80
+ };
81
+ };
82
+ /**
83
+ * Validates OpenCode configuration against schema.
84
+ *
85
+ * @param config - Configuration object to validate
86
+ * @returns Validation result with errors if any
87
+ */
88
+ export declare function validateOpenCodeConfig(config: unknown): {
89
+ valid: boolean;
90
+ errors?: string[];
91
+ };
92
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/types/schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4EvB,CAAA;AAEV;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG;IACvD,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB,CAqDA"}