import type { Transport } from "@elyracode/ai"; import { type ContextPruningSettings } from "./context-pruning.js"; /** * User-pinned models per smart-routing tier. * Values are model references like "anthropic/claude-haiku-4-5". */ export interface SmartRoutingModels { fast?: string; balanced?: string; powerful?: string; } /** * Default per-tier model pins for smart routing. User settings override these * per tier. A pin only takes effect when the referenced model is actually * available (resolved against the model registry), so this safely falls back * to the heuristic ranking for users who don't have Anthropic configured. */ export declare const DEFAULT_SMART_ROUTING_MODELS: SmartRoutingModels; export interface CompactionSettings { enabled?: boolean; reserveTokens?: number; keepRecentTokens?: number; } export interface BranchSummarySettings { reserveTokens?: number; skipPrompt?: boolean; } export interface ProviderRetrySettings { timeoutMs?: number; maxRetries?: number; maxRetryDelayMs?: number; } export interface RetrySettings { enabled?: boolean; maxRetries?: number; baseDelayMs?: number; provider?: ProviderRetrySettings; } export interface TerminalSettings { showImages?: boolean; imageWidthCells?: number; clearOnShrink?: boolean; showTerminalProgress?: boolean; hyperlinks?: "auto" | "on" | "off"; images?: "auto" | "kitty" | "iterm2" | "off"; trueColor?: "auto" | "on" | "off"; } export interface ImageSettings { autoResize?: boolean; blockImages?: boolean; } export interface ThinkingBudgetsSettings { minimal?: number; low?: number; medium?: number; high?: number; } export interface MarkdownSettings { codeBlockIndent?: string; } export interface WarningSettings { anthropicExtraUsage?: boolean; /** One-time flag: the Anthropic extra-usage warning has been shown on this install. */ anthropicExtraUsageShown?: boolean; } export type TransportSetting = Transport; /** * Package source for npm/git packages. * - String form: load all resources from the package * - Object form: filter which resources to load */ export type PackageSource = string | { source: string; extensions?: string[]; skills?: string[]; prompts?: string[]; themes?: string[]; }; /** * Anthropic prompt caches expire after 5 minutes of inactivity (default TTL). While the user * reads or types, the cache goes cold and the next turn pays full input price for the whole * prefix. A warm ping (same request, max_tokens 1) shortly before expiry costs one cache read * (~10% of input price) and resets the TTL. Worth it for short pauses on large prefixes; for * long pauses the 1h TTL (`ELYRA_CACHE_RETENTION=long`) is cheaper. */ export interface CacheWarmingSettings { /** Default: true */ enabled: boolean; /** Milliseconds after a turn ends before the first ping. Default: 240000 (4 min). */ delayMs: number; /** Pings per idle period before giving up. Default: 2 (covers ~13 minutes). */ maxPings: number; /** Skip warming when the last request's prefix was smaller than this. Default: 20000 tokens. */ minPrefixTokens: number; } export declare const DEFAULT_CACHE_WARMING: CacheWarmingSettings; export interface Settings { lastChangelogVersion?: string; defaultProvider?: string; defaultModel?: string; defaultThinkingLevel?: "off" | "minimal" | "low" | "medium" | "high" | "xhigh"; transport?: TransportSetting; steeringMode?: "all" | "one-at-a-time"; followUpMode?: "all" | "one-at-a-time"; theme?: string; compaction?: CompactionSettings; /** Request-time pruning of stale tool results. Session history and compaction are unaffected. */ contextPruning?: Partial; /** Keep the Anthropic prompt cache warm while the user is idle. See getCacheWarmingSettings. */ cacheWarming?: Partial; branchSummary?: BranchSummarySettings; retry?: RetrySettings; hideThinkingBlock?: boolean; shellPath?: string; quietStartup?: boolean; shellCommandPrefix?: string; npmCommand?: string[]; collapseChangelog?: boolean; smartRouting?: boolean; smartRoutingModels?: SmartRoutingModels; goalBatchModels?: boolean; providerFailover?: boolean; routingLedger?: boolean; codebaseMemory?: boolean; gitCostTrailer?: boolean; /** * Keep the tool list sent to the provider stable when tools are toggled mid-session, so the prompt * cache prefix (tools + system prompt) survives. Inactive tools are still sent but blocked on call. * Default: true. Set to false to send only the active tools (smaller prompt, cache miss on toggle). */ stableToolSet?: boolean; /** Architecture decision log in /.elyra/memory/decisions/. "confirm" asks before the agent records a decision. Default: confirm */ decisionLog?: "off" | "confirm" | "auto"; autoSkills?: boolean; autoExtensions?: boolean; diffInEditor?: boolean; packages?: PackageSource[]; extensions?: string[]; skills?: string[]; prompts?: string[]; themes?: string[]; enableSkillCommands?: boolean; terminal?: TerminalSettings; images?: ImageSettings; enabledModels?: string[]; doubleEscapeAction?: "fork" | "tree" | "none"; treeFilterMode?: "default" | "no-tools" | "user-only" | "labeled-only" | "all"; thinkingBudgets?: ThinkingBudgetsSettings; editorPaddingX?: number; autocompleteMaxVisible?: number; showHardwareCursor?: boolean; markdown?: MarkdownSettings; warnings?: WarningSettings; sessionDir?: string; /** Show minimal footer (cwd, branch, model only -- no token stats or context usage) */ minimalFooter?: boolean; /** Files pinned to context (survive compaction). Project-scoped. */ pinnedFiles?: string[]; } export type SettingsScope = "global" | "project"; export interface SettingsStorage { withLock(scope: SettingsScope, fn: (current: string | undefined) => string | undefined): void; } export interface SettingsError { scope: SettingsScope; error: Error; } export declare class FileSettingsStorage implements SettingsStorage { private globalSettingsPath; private projectSettingsPath; constructor(cwd: string, agentDir: string); private acquireLockSyncWithRetry; withLock(scope: SettingsScope, fn: (current: string | undefined) => string | undefined): void; } export declare class InMemorySettingsStorage implements SettingsStorage { private global; private project; withLock(scope: SettingsScope, fn: (current: string | undefined) => string | undefined): void; } export declare class SettingsManager { private storage; private globalSettings; private projectSettings; private settings; private modifiedFields; private modifiedNestedFields; private modifiedProjectFields; private modifiedProjectNestedFields; private globalSettingsLoadError; private projectSettingsLoadError; private writeQueue; private errors; private constructor(); /** Create a SettingsManager that loads from files */ static create(cwd: string, agentDir?: string): SettingsManager; /** Create a SettingsManager from an arbitrary storage backend */ static fromStorage(storage: SettingsStorage): SettingsManager; /** Create an in-memory SettingsManager (no file I/O) */ static inMemory(settings?: Partial): SettingsManager; private static loadFromStorage; private static tryLoadFromStorage; /** Migrate old settings format to new format */ private static migrateSettings; getGlobalSettings(): Settings; getProjectSettings(): Settings; reload(): Promise; /** Apply additional overrides on top of current settings */ applyOverrides(overrides: Partial): void; /** Mark a global field as modified during this session */ private markModified; /** Mark a project field as modified during this session */ private markProjectModified; private recordError; private clearModifiedScope; private enqueueWrite; private cloneModifiedNestedFields; private persistScopedSettings; private save; private saveProjectSettings; flush(): Promise; drainErrors(): SettingsError[]; getLastChangelogVersion(): string | undefined; markAnthropicExtraUsageWarningShown(): void; setLastChangelogVersion(version: string): void; getSessionDir(): string | undefined; getDefaultProvider(): string | undefined; getDefaultModel(): string | undefined; setDefaultProvider(provider: string): void; setDefaultModel(modelId: string): void; setDefaultModelAndProvider(provider: string, modelId: string): void; getSteeringMode(): "all" | "one-at-a-time"; setSteeringMode(mode: "all" | "one-at-a-time"): void; getFollowUpMode(): "all" | "one-at-a-time"; setFollowUpMode(mode: "all" | "one-at-a-time"): void; getTheme(): string | undefined; setTheme(theme: string): void; getDefaultThinkingLevel(): "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | undefined; setDefaultThinkingLevel(level: "off" | "minimal" | "low" | "medium" | "high" | "xhigh"): void; getTransport(): TransportSetting; setTransport(transport: TransportSetting): void; getCompactionEnabled(): boolean; setCompactionEnabled(enabled: boolean): void; getCompactionReserveTokens(): number; getCompactionKeepRecentTokens(): number; getCompactionSettings(): { enabled: boolean; reserveTokens: number; keepRecentTokens: number; }; getContextPruning(): ContextPruningSettings; getBranchSummarySettings(): { reserveTokens: number; skipPrompt: boolean; }; getBranchSummarySkipPrompt(): boolean; getRetryEnabled(): boolean; setRetryEnabled(enabled: boolean): void; getRetrySettings(): { enabled: boolean; maxRetries: number; baseDelayMs: number; }; getProviderRetrySettings(): { timeoutMs?: number; maxRetries?: number; maxRetryDelayMs: number; }; getHideThinkingBlock(): boolean; setHideThinkingBlock(hide: boolean): void; getShellPath(): string | undefined; setShellPath(path: string | undefined): void; getQuietStartup(): boolean; setQuietStartup(quiet: boolean): void; getShellCommandPrefix(): string | undefined; setShellCommandPrefix(prefix: string | undefined): void; getNpmCommand(): string[] | undefined; setNpmCommand(command: string[] | undefined): void; getCollapseChangelog(): boolean; setCollapseChangelog(collapse: boolean): void; getSmartRouting(): boolean; getProviderFailover(): boolean; getRoutingLedger(): boolean; setSmartRouting(enabled: boolean): void; getSmartRoutingModels(): SmartRoutingModels; getGoalBatchModels(): boolean; getCodebaseMemory(): boolean; getDecisionLog(): "off" | "confirm" | "auto"; setDecisionLog(mode: "off" | "confirm" | "auto"): void; setCodebaseMemory(enabled: boolean): void; getGitCostTrailer(): boolean; getStableToolSet(): boolean; getCacheWarmingSettings(): CacheWarmingSettings; setGitCostTrailer(enabled: boolean): void; getAutoSkills(): boolean; setAutoSkills(enabled: boolean): void; getAutoExtensions(): boolean; setAutoExtensions(enabled: boolean): void; getDiffInEditor(): boolean; setDiffInEditor(enabled: boolean): void; getPackages(): PackageSource[]; setPackages(packages: PackageSource[]): void; setProjectPackages(packages: PackageSource[]): void; getExtensionPaths(): string[]; setExtensionPaths(paths: string[]): void; setProjectExtensionPaths(paths: string[]): void; getSkillPaths(): string[]; setSkillPaths(paths: string[]): void; setProjectSkillPaths(paths: string[]): void; getPromptTemplatePaths(): string[]; setPromptTemplatePaths(paths: string[]): void; setProjectPromptTemplatePaths(paths: string[]): void; getThemePaths(): string[]; setThemePaths(paths: string[]): void; setProjectThemePaths(paths: string[]): void; getEnableSkillCommands(): boolean; setEnableSkillCommands(enabled: boolean): void; getThinkingBudgets(): ThinkingBudgetsSettings | undefined; getShowImages(): boolean; setShowImages(show: boolean): void; getImageWidthCells(): number; setImageWidthCells(width: number): void; getClearOnShrink(): boolean; setClearOnShrink(enabled: boolean): void; getShowTerminalProgress(): boolean; setShowTerminalProgress(enabled: boolean): void; getImageAutoResize(): boolean; setImageAutoResize(enabled: boolean): void; getBlockImages(): boolean; setBlockImages(blocked: boolean): void; getEnabledModels(): string[] | undefined; setEnabledModels(patterns: string[] | undefined): void; getDoubleEscapeAction(): "fork" | "tree" | "none"; setDoubleEscapeAction(action: "fork" | "tree" | "none"): void; getTreeFilterMode(): "default" | "no-tools" | "user-only" | "labeled-only" | "all"; setTreeFilterMode(mode: "default" | "no-tools" | "user-only" | "labeled-only" | "all"): void; getShowHardwareCursor(): boolean; setShowHardwareCursor(enabled: boolean): void; getEditorPaddingX(): number; setEditorPaddingX(padding: number): void; getAutocompleteMaxVisible(): number; setAutocompleteMaxVisible(maxVisible: number): void; getCodeBlockIndent(): string; getTerminalSettings(): TerminalSettings; getWarnings(): WarningSettings; setWarnings(warnings: WarningSettings): void; getMinimalFooter(): boolean; setMinimalFooter(enabled: boolean): void; getPinnedFiles(): string[]; addPinnedFile(filePath: string): void; removePinnedFile(filePath: string): void; } //# sourceMappingURL=settings-manager.d.ts.map