2026-03-10 22:28:37 -06:00
|
|
|
import {
|
|
|
|
|
AuthStorage,
|
|
|
|
|
ModelRegistry,
|
|
|
|
|
SettingsManager,
|
|
|
|
|
SessionManager,
|
|
|
|
|
createAgentSession,
|
|
|
|
|
InteractiveMode,
|
|
|
|
|
} from '@mariozechner/pi-coding-agent'
|
|
|
|
|
import { agentDir, sessionsDir, authFilePath } from './app-paths.js'
|
|
|
|
|
import { buildResourceLoader, initResources } from './resource-loader.js'
|
|
|
|
|
import { loadStoredEnvKeys, runWizardIfNeeded } from './wizard.js'
|
|
|
|
|
|
|
|
|
|
const authStorage = AuthStorage.create(authFilePath)
|
|
|
|
|
loadStoredEnvKeys(authStorage)
|
|
|
|
|
await runWizardIfNeeded(authStorage)
|
|
|
|
|
|
|
|
|
|
const modelRegistry = new ModelRegistry(authStorage)
|
|
|
|
|
const settingsManager = SettingsManager.create(agentDir)
|
|
|
|
|
|
2026-03-11 01:51:48 -06:00
|
|
|
// Always ensure defaults: anthropic/claude-sonnet-4-6, thinking off.
|
|
|
|
|
// Validates on every startup — catches stale settings from prior installs
|
|
|
|
|
// (e.g. grok-2 which no longer exists) and fresh installs with no settings.
|
2026-03-11 01:37:14 -06:00
|
|
|
const configuredProvider = settingsManager.getDefaultProvider()
|
|
|
|
|
const configuredModel = settingsManager.getDefaultModel()
|
2026-03-11 01:51:48 -06:00
|
|
|
const allModels = modelRegistry.getAll()
|
2026-03-11 01:37:14 -06:00
|
|
|
const configuredExists = configuredProvider && configuredModel &&
|
2026-03-11 01:51:48 -06:00
|
|
|
allModels.some((m) => m.provider === configuredProvider && m.id === configuredModel)
|
2026-03-11 01:37:14 -06:00
|
|
|
|
|
|
|
|
if (!configuredModel || !configuredExists) {
|
2026-03-11 01:51:48 -06:00
|
|
|
// Preferred default: anthropic/claude-sonnet-4-6
|
|
|
|
|
const preferred =
|
|
|
|
|
allModels.find((m) => m.provider === 'anthropic' && m.id === 'claude-sonnet-4-6') ||
|
|
|
|
|
allModels.find((m) => m.provider === 'anthropic' && m.id.includes('sonnet')) ||
|
|
|
|
|
allModels.find((m) => m.provider === 'anthropic')
|
|
|
|
|
if (preferred) {
|
2026-03-10 23:54:33 -06:00
|
|
|
settingsManager.setDefaultModelAndProvider(preferred.provider, preferred.id)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-11 01:51:48 -06:00
|
|
|
// Default thinking level: off (always reset if not explicitly set)
|
|
|
|
|
if (settingsManager.getDefaultThinkingLevel() !== 'off' && !configuredExists) {
|
2026-03-11 01:37:14 -06:00
|
|
|
settingsManager.setDefaultThinkingLevel('off')
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-10 22:28:37 -06:00
|
|
|
// GSD always uses quiet startup — the gsd extension renders its own branded header
|
|
|
|
|
if (!settingsManager.getQuietStartup()) {
|
|
|
|
|
settingsManager.setQuietStartup(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Collapse changelog by default — avoid wall of text on updates
|
|
|
|
|
if (!settingsManager.getCollapseChangelog()) {
|
|
|
|
|
settingsManager.setCollapseChangelog(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const sessionManager = SessionManager.create(process.cwd(), sessionsDir)
|
|
|
|
|
|
|
|
|
|
initResources(agentDir)
|
|
|
|
|
const resourceLoader = buildResourceLoader(agentDir)
|
|
|
|
|
await resourceLoader.reload()
|
|
|
|
|
|
|
|
|
|
const { session, extensionsResult } = await createAgentSession({
|
|
|
|
|
authStorage,
|
|
|
|
|
modelRegistry,
|
|
|
|
|
settingsManager,
|
|
|
|
|
sessionManager,
|
|
|
|
|
resourceLoader,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if (extensionsResult.errors.length > 0) {
|
|
|
|
|
for (const err of extensionsResult.errors) {
|
|
|
|
|
process.stderr.write(`[gsd] Extension load error: ${err.error}\n`)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const interactiveMode = new InteractiveMode(session)
|
|
|
|
|
await interactiveMode.run()
|