π File detail
migrations/migrateLegacyOpusToCurrent.ts
π§© .tsπ 58 linesπΎ 1,974 bytesπ text
β Back to All Filesπ― Use case
This file lives under βmigrations/β, which covers version migrations for settings or on-disk data. On the API surface it exposes migrateLegacyOpusToCurrent β mainly functions, hooks, or classes. It composes internal code from services and utils (relative imports).
Generated from folder role, exports, dependency roots, and inline comments β not hand-reviewed for every path.
π§ Inline summary
import { type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, logEvent, } from '../services/analytics/index.js' import { saveGlobalConfig } from '../utils/config.js'
π€ Exports (heuristic)
migrateLegacyOpusToCurrent
π₯οΈ Source preview
import {
type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
logEvent,
} from '../services/analytics/index.js'
import { saveGlobalConfig } from '../utils/config.js'
import { isLegacyModelRemapEnabled } from '../utils/model/model.js'
import { getAPIProvider } from '../utils/model/providers.js'
import {
getSettingsForSource,
updateSettingsForSource,
} from '../utils/settings/settings.js'
/**
* Migrate first-party users off explicit Opus 4.0/4.1 model strings.
*
* The 'opus' alias already resolves to Opus 4.6 for 1P, so anyone still
* on an explicit 4.0/4.1 string pinned it in settings before 4.5 launched.
* parseUserSpecifiedModel now silently remaps these at runtime anyway β
* this migration cleans up the settings file so /model shows the right
* thing, and sets a timestamp so the REPL can show a one-time notification.
*
* Only touches userSettings. Legacy strings in project/local/policy settings
* are left alone (we can't/shouldn't rewrite those) and are still remapped at
* runtime by parseUserSpecifiedModel. Reading and writing the same source
* keeps this idempotent without a completion flag, and avoids silently
* promoting 'opus' to the global default for users who only pinned it in one
* project.
*/
export function migrateLegacyOpusToCurrent(): void {
if (getAPIProvider() !== 'firstParty') {
return
}
if (!isLegacyModelRemapEnabled()) {
return
}
const model = getSettingsForSource('userSettings')?.model
if (
model !== 'claude-opus-4-20250514' &&
model !== 'claude-opus-4-1-20250805' &&
model !== 'claude-opus-4-0' &&
model !== 'claude-opus-4-1'
) {
return
}
updateSettingsForSource('userSettings', { model: 'opus' })
saveGlobalConfig(current => ({
...current,
legacyOpusMigrationTimestamp: Date.now(),
}))
logEvent('tengu_legacy_opus_migration', {
from_model:
model as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
})
}