import type { AnimationStyle, OrchestrationMode } from "./agent-registry.js"; import type { JoinMode, PromptCompressionLevel } from "./types.js"; import type { DashboardKeybindingsOverride } from "./ui/dashboard-keybindings.js"; import type { FooterStatusConfig } from "./ui/footer-status-config.js"; /** Optional override roots for local offline debug captures. */ export interface DebugCapturePathOverrides { project?: string; personal?: string; } export type { PromptCompressionLevel } from "./types.js"; export interface SubagentsSettings { maxConcurrent?: number; /** Persisted per-agent token cap for spend warnings; 0/omitted = off. */ perAgentTokenLimit?: number; maxAgentsPerSession?: number; maxTotalTurnsPerSession?: number; /** 0 is the explicit unlimited marker. */ defaultMaxTurns?: number; graceTurns?: number; /** * Max revision turns after a blocking `subagent:end` hook. * `0` (default) = fail closed on block with no revision attempt. */ maxEndHookRevisions?: number; defaultJoinMode?: JoinMode; schedulingEnabled?: boolean; /** * Override the model used by spawned subagents. * - `"inherit"`: use the session-default (parent) model — useful when a * built-in read-only agent's configured model (e.g. Explore's pinned * `anthropic/claude-haiku-4-5`) is unreachable in this install. * - `"/"`: pin a specific model. * - `undefined` (default): each agent uses its own configured model. */ subagentModel?: string; /** Persisted motion profile; legacy single-spinner values remain valid. */ animationStyle?: AnimationStyle; uiStyle?: "premium" | "retro" | "plain"; showActivityStream?: boolean; showTokenUsage?: boolean; showTurnProgress?: boolean; /** Persistent AGENT TOP strip above the editor when agents are active (default: true). */ showAgentTopWidget?: boolean; orchestrationMode?: OrchestrationMode; dashboardRefreshInterval?: number; promptCompressionLevel?: PromptCompressionLevel; debugCapture?: boolean; debugCapturePaths?: DebugCapturePathOverrides; /** Per-action key lists for the interactive dashboard and top view. */ dashboardKeybindings?: DashboardKeybindingsOverride; /** Pi footer status slot configuration (the `subagents` bar). */ footerStatus?: Partial; } export interface SettingsAppliers { setMaxConcurrent: (value: number) => void; setPerAgentTokenLimit: (value: number) => void; setSessionLimits: (limits: { maxAgentsPerSession?: number; maxTotalTurnsPerSession?: number; }) => void; setDefaultMaxTurns: (value: number) => void; setGraceTurns: (value: number) => void; setMaxEndHookRevisions: (value: number) => void; setDefaultJoinMode: (mode: JoinMode) => void; setSchedulingEnabled: (enabled: boolean) => void; setAnimationStyle: (style: AnimationStyle) => void; setUiStyle: (style: "premium" | "retro" | "plain") => void; setShowActivityStream: (enabled: boolean) => void; setShowTokenUsage: (enabled: boolean) => void; setShowTurnProgress: (enabled: boolean) => void; setShowAgentTopWidget: (enabled: boolean) => void; setOrchestrationMode: (mode: OrchestrationMode) => void; setDashboardRefreshInterval: (interval: number) => void; setPromptCompressionLevel: (level: PromptCompressionLevel) => void; setDebugCapture: (enabled: boolean) => void; setDebugCapturePaths: (paths: DebugCapturePathOverrides) => void; setDashboardKeybindings: (bindings?: DashboardKeybindingsOverride) => void; setFooterStatusConfig: (config?: Partial) => void; } export interface SettingsGetters { getDefaultMaxTurns: () => number | undefined; getGraceTurns: () => number; getMaxEndHookRevisions: () => number; getDefaultJoinMode: () => JoinMode; isSchedulingEnabled: () => boolean; } export interface SettingsSetters { setDefaultMaxTurns: (value: number | undefined) => void; setGraceTurns: (value: number) => void; setMaxEndHookRevisions: (value: number) => void; setDefaultJoinMode: (mode: JoinMode) => void; setSchedulingEnabled: (enabled: boolean) => void; } export type SettingsEmit = (event: string, payload: unknown) => void; export declare const VALID_ANIMATION_STYLES: readonly ["orchestrator", "signals", "minimal", "reduced", "braille", "dots", "lines", "classic", "none"]; /** Load merged settings: global provides defaults, project overrides. */ export declare function loadSettings(cwd?: string): SubagentsSettings; /** Resolve canonical session limits. */ export declare function resolveSessionLimits(settings: SubagentsSettings): { maxAgentsPerSession?: number; maxTotalTurnsPerSession?: number; } | undefined; /** Prepare settings for persistence with canonical session-limit keys only. */ export declare function prepareSettingsForSave(settings: SubagentsSettings): SubagentsSettings; /** Persist project-local settings. Global defaults are never mutated. */ export declare function saveSettings(settings: SubagentsSettings, cwd?: string): boolean; /** Drop deprecated session-limit aliases before persisting canonical keys. */ export declare function stripDeprecatedSessionLimitAliases(settings: SubagentsSettings): SubagentsSettings; /** Apply persisted settings to in-memory state. */ export declare function applySettings(settings: SubagentsSettings, appliers: SettingsAppliers): void; export declare function persistToastFor(successMessage: string, persisted: boolean): { message: string; level: "info" | "warning"; }; /** * Settings values that are provably CAPTURED at dispatch rather than read * live at enforcement: `tools/agent.ts` bakes the effective max turns into * every spawn and the runner resolves it once per run, so a change reaches * only the NEXT dispatch. Live-enforced limits (maxAgentsPerSession at the * spawn gate, maxTotalTurnsPerSession at the turn gate, perAgentTokenLimit in * the spend check) are deliberately absent — they already apply to the * running session at the next enforcement point and never emit a notice. */ export interface CapturedDispatchLimits { /** Effective per-agent max turns; `undefined` = unlimited. */ defaultMaxTurns?: number; } /** One-time notice that a dispatch-captured limit changed (R2). */ export interface CapturedLimitNotice { setting: "defaultMaxTurns"; previous: number | undefined; next: number | undefined; /** Operator-facing message stating when the new value takes effect. */ message: string; } /** Extract the dispatch-captured limits from a settings object (0 = unlimited). */ export declare function extractCapturedDispatchLimits(settings: SubagentsSettings | undefined): CapturedDispatchLimits; /** * Diff previously-applied vs newly-applied dispatch-captured limits (R2). * Returns at most one notice per changed value. The caller feeds it once per * `subagents:settings_changed` event — which fires exactly once per accepted * settings change — so notices are once-per-change, never per turn. Returns * `[]` when nothing captured changed, including changes that only touch * live-enforced limits. */ export declare function capturedDispatchNotices(previous: CapturedDispatchLimits, next: CapturedDispatchLimits): CapturedLimitNotice[]; export declare function applyAndEmitLoaded(appliers: SettingsAppliers, emit: SettingsEmit, cwd?: string): SubagentsSettings; export declare function saveAndEmitChanged(snapshot: SubagentsSettings, successMessage: string, emit: SettingsEmit, cwd?: string): { message: string; level: "info" | "warning"; };