import assert from 'node:assert/strict'; import test from 'node:test'; import { OpenCodeProviderModels, OPENCODE_PREDEFINED_MODELS, } from '@/modules/providers/list/opencode/opencode-models.provider.js'; test('OpenCode exposes only the curated predefined catalog', async () => { const adapter = new OpenCodeProviderModels(); assert.deepEqual(await adapter.getSupportedModels(), OPENCODE_PREDEFINED_MODELS); assert.equal( (await adapter.getCurrentActiveModel()).model, OPENCODE_PREDEFINED_MODELS.DEFAULT, ); // OpenCode routes by `/`, so every option has to carry a // provider prefix that `opencode models --verbose` reports. const providerIds = new Set( OPENCODE_PREDEFINED_MODELS.OPTIONS.map((option) => option.value.split('/')[0]), ); assert.deepEqual([...providerIds].sort(), ['anthropic', 'opencode', 'openai'].sort()); assert.equal( OPENCODE_PREDEFINED_MODELS.OPTIONS.every((option) => /^[a-z0-9-]+\/.+/.test(option.value)), true, ); assert.equal( new Set(OPENCODE_PREDEFINED_MODELS.OPTIONS.map((option) => option.value)).size, OPENCODE_PREDEFINED_MODELS.OPTIONS.length, ); assert.equal(OPENCODE_PREDEFINED_MODELS.DEFAULT, 'opencode/gpt-5.6-terra'); assert.ok( OPENCODE_PREDEFINED_MODELS.OPTIONS.some((option) => option.value === 'opencode/claude-opus-5'), ); assert.ok( OPENCODE_PREDEFINED_MODELS.OPTIONS.some((option) => option.value === 'anthropic/claude-opus-5'), ); assert.ok( OPENCODE_PREDEFINED_MODELS.OPTIONS.some((option) => option.value === 'openai/gpt-5.6'), ); });