119e18c810
- Extract atlas/ into 15 focused modules (hook, event handler, tool policies, types, etc.) - Split auto-update-checker into checker/ and hook/ subdirectories with single-purpose files - Decompose session-recovery into separate recovery strategy files per error type - Extract todo-continuation-enforcer from monolith to directory with dedicated modules - Split background-task/tools.ts into individual tool creator files - Extract command-executor, tmux-utils into focused sub-modules - Split config/schema.ts into domain-specific schema files - Decompose cli/config-manager.ts into focused modules - Rollback skill-mcp-manager, model-availability, index.ts splits that broke tests - Fix all import path depths for moved files (../../ -> ../../../) - Add explicit type annotations to resolve TS7006 implicit any errors Typecheck: 0 errors Tests: 2359 pass, 5 fail (all pre-existing)
80 lines
2.8 KiB
TypeScript
80 lines
2.8 KiB
TypeScript
import type { PluginInput } from "@opencode-ai/plugin"
|
|
import { runBunInstall } from "../../../cli/config-manager"
|
|
import { log } from "../../../shared/logger"
|
|
import { invalidatePackage } from "../cache"
|
|
import { PACKAGE_NAME } from "../constants"
|
|
import { extractChannel } from "../version-channel"
|
|
import { findPluginEntry, getCachedVersion, getLatestVersion, updatePinnedVersion } from "../checker"
|
|
import { showAutoUpdatedToast, showUpdateAvailableToast } from "./update-toasts"
|
|
|
|
async function runBunInstallSafe(): Promise<boolean> {
|
|
try {
|
|
return await runBunInstall()
|
|
} catch (err) {
|
|
const errorMessage = err instanceof Error ? err.message : String(err)
|
|
log("[auto-update-checker] bun install error:", errorMessage)
|
|
return false
|
|
}
|
|
}
|
|
|
|
export async function runBackgroundUpdateCheck(
|
|
ctx: PluginInput,
|
|
autoUpdate: boolean,
|
|
getToastMessage: (isUpdate: boolean, latestVersion?: string) => string
|
|
): Promise<void> {
|
|
const pluginInfo = findPluginEntry(ctx.directory)
|
|
if (!pluginInfo) {
|
|
log("[auto-update-checker] Plugin not found in config")
|
|
return
|
|
}
|
|
|
|
const cachedVersion = getCachedVersion()
|
|
const currentVersion = cachedVersion ?? pluginInfo.pinnedVersion
|
|
if (!currentVersion) {
|
|
log("[auto-update-checker] No version found (cached or pinned)")
|
|
return
|
|
}
|
|
|
|
const channel = extractChannel(pluginInfo.pinnedVersion ?? currentVersion)
|
|
const latestVersion = await getLatestVersion(channel)
|
|
if (!latestVersion) {
|
|
log("[auto-update-checker] Failed to fetch latest version for channel:", channel)
|
|
return
|
|
}
|
|
|
|
if (currentVersion === latestVersion) {
|
|
log("[auto-update-checker] Already on latest version for channel:", channel)
|
|
return
|
|
}
|
|
|
|
log(`[auto-update-checker] Update available (${channel}): ${currentVersion} → ${latestVersion}`)
|
|
|
|
if (!autoUpdate) {
|
|
await showUpdateAvailableToast(ctx, latestVersion, getToastMessage)
|
|
log("[auto-update-checker] Auto-update disabled, notification only")
|
|
return
|
|
}
|
|
|
|
if (pluginInfo.isPinned) {
|
|
const updated = updatePinnedVersion(pluginInfo.configPath, pluginInfo.entry, latestVersion)
|
|
if (!updated) {
|
|
await showUpdateAvailableToast(ctx, latestVersion, getToastMessage)
|
|
log("[auto-update-checker] Failed to update pinned version in config")
|
|
return
|
|
}
|
|
log(`[auto-update-checker] Config updated: ${pluginInfo.entry} → ${PACKAGE_NAME}@${latestVersion}`)
|
|
}
|
|
|
|
invalidatePackage(PACKAGE_NAME)
|
|
|
|
const installSuccess = await runBunInstallSafe()
|
|
|
|
if (installSuccess) {
|
|
await showAutoUpdatedToast(ctx, currentVersion, latestVersion)
|
|
log(`[auto-update-checker] Update installed: ${currentVersion} → ${latestVersion}`)
|
|
} else {
|
|
await showUpdateAvailableToast(ctx, latestVersion, getToastMessage)
|
|
log("[auto-update-checker] bun install failed; update not installed (falling back to notification-only)")
|
|
}
|
|
}
|