Skip to content
← Public packages

@kentcdodds/ai

Kody tool-using agent turns with Vercel AI SDK and Cloudflare AI Gateway.

src/legacy-value.ts

59 lines · 1.6 KB · TypeScript
import { packageStorage } from 'kody:runtime'
import settings from 'kody:@kentcdodds/ai/settings'

const ownerSettingFields = {
	cloudflareAccountId: 'accountId',
	cloudflareAiGatewayId: 'gatewayId',
	cloudflareAiModel: 'model',
} as const

export async function readLocalSetting(name: string): Promise<string> {
	const storage = packageStorage()
	const stored = await storage.get(name)
	if (typeof stored === 'string' && stored.trim()) return stored.trim()
	return ''
}

export async function readNamedSetting(name: string): Promise<string> {
	const local = await readLocalSetting(name)
	if (local) return local
	return await readOwnerSetting(name)
}

async function readOwnerSetting(name: string): Promise<string> {
	const field = ownerSettingFields[name as keyof typeof ownerSettingFields]
	if (!field) return ''
	try {
		const ownerSettings = (await settings({})) as {
			accountId?: unknown
			gatewayId?: unknown
			model?: unknown
		} | null
		const raw = ownerSettings?.[field]
		const value = typeof raw === 'string' ? raw.trim() : ''
		if (value) {
			await packageStorage().set(name, value)
			return value
		}
	} catch {
		// Host snapshots should still fail clearly if the owning package has no id.
	}
	return ''
}

export async function writeNamedSetting(name: string, value: string) {
	await packageStorage().set(name, value)
}

export async function migrateAiFromValues() {
	const names = [
		'cloudflareAccountId',
		'cloudflareAiGatewayId',
		'cloudflareAiModel',
	]
	const copied: Array<string> = []
	for (const name of names) {
		if (await readLocalSetting(name)) copied.push(name)
	}
	return { copied }
}