import type { ImageContent } from '../../ai/types.js';
import type { ExtensionUIDialogOptions } from '../../app/extensions/index.js';
import type { StartupInfoEntry } from '../../app/startup-info.js';
import type { SkillDownloadApprovalHandler } from '../../app/sync/skills-download.js';
import type { SkillsSyncStatus } from '../../app/sync/skills-status.js';
import type { SkillUploadApprovalRequest } from '../../app/sync/skills-upload.js';
import type { WorkbookScopeStateRef } from '../../app/workbook-scope.js';
import type { SelectItem } from '../../tui/index.js';
import type { Terminal } from '../../tui/terminal.js';
import type { SlashCommandDefinition } from './slash-commands.js';
import type { WorkbookScopeDeps } from './workbook-scope-controller.js';
export type CompactionQueuedMessage = {
    text: string;
    mode: 'steer' | 'followUp';
};
/** Credit balance info for footer display. */
export interface CreditBalance {
    creditsRemaining: number;
    isUnlimited: boolean;
    hasTeamBilling: boolean;
}
/**
 * Constructor contract for InteractiveMode. Keeping this out of the main
 * class file gives the shell a stable public boundary and keeps rendering
 * orchestration from owning every injected startup dependency.
 */
export interface InteractiveModeOptions {
    /** Custom terminal implementation for the interactive shell. */
    terminal?: Terminal;
    skipShortcutAuth?: boolean;
    exitProcessOnShutdown?: boolean;
    workbookScopeRef?: WorkbookScopeStateRef;
    /** Warning message if session model couldn't be restored */
    modelFallbackMessage?: string;
    /** Warnings collected during startup (XLL sync, setup, etc.) */
    startupWarnings?: string[];
    /** Informational messages collected during startup (e.g. setup needed). */
    startupInfos?: StartupInfoEntry[];
    /** Initial message to send on startup (can include @file content) */
    initialMessage?: string;
    /** Images to attach to the initial message */
    initialImages?: ImageContent[];
    /** Additional messages to send after the initial message */
    initialMessages?: string[];
    /** Force verbose startup (overrides quietStartup setting) */
    verbose?: boolean;
    /**
     * Fetch credit balance for the current API key. Injected by main.ts.
     * Returns CreditBalance when credits apply, 'not_applicable' when the model
     * doesn't use credits, or null when the model uses credits but the fetch failed.
     */
    fetchCreditBalance?: (apiKey: string) => Promise<CreditBalance | null | 'not_applicable'>;
    /** Display order for OAuth providers in the login/logout selector. */
    oauthProviderOrder?: string[];
    /** Additional slash commands (e.g. dev-only commands). */
    extraSlashCommands?: ReadonlyArray<{
        name: string;
        description: string;
    }>;
    /** Additional slash commands handled by the main slash-command registry. */
    slashCommands?: ReadonlyArray<SlashCommandDefinition>;
    /** Called when an extra slash command is invoked. Returns true if handled. */
    onDevCommand?: (command: string, showStatus: (msg: string) => void, select: (title: string, options: string[] | SelectItem[], opts?: ExtensionUIDialogOptions) => Promise<string | undefined>, input: (title: string, placeholder?: string) => Promise<string | undefined>, triggerLogin?: (providerId?: string) => Promise<void>, triggerLogout?: (providerId?: string) => Promise<void>) => boolean | Promise<boolean>;
    /** Called after each agent_end. Receives a setStatus fn to update footer extension statuses. */
    onAgentEnd?: () => void;
    /** Called once during run() with callbacks for the footer status line and extension widgets. */
    onReady?: (callbacks: {
        setStatus: (key: string, text: string | undefined) => void;
        setWidget: (key: string, lines: string[] | undefined, options?: {
            placement?: 'aboveEditor' | 'belowEditor';
        }) => void;
        /** Set a badge on the editor's top border line (right-aligned). Pass undefined to clear. */
        setEditorBadge: (text: string | undefined) => void;
    }) => void;
    sandboxActive?: boolean;
    /** Initial agent mode name (e.g. 'action', 'plan', 'ask'). Shown in footer. */
    initialMode?: string;
    /** Injected by main.ts - fetch/parse workbook summaries. */
    workbookScopeDeps?: WorkbookScopeDeps;
    devMode?: boolean;
    /** Manual interactive cloud pull for skills. Injected by main.ts. */
    downloadSkillsWithApproval?: (approve: SkillDownloadApprovalHandler) => Promise<{
        downloaded: string[];
        skipped: string[];
        skippedByUser: string[];
        filesDownloaded: number;
        errors: string[];
    }>;
    /** Upload managed local skills to cloud. Injected by main.ts. Undefined when not logged in. */
    uploadSkills?: (approve: (request: SkillUploadApprovalRequest) => Promise<boolean>) => Promise<{
        uploaded: string[];
        skipped: string[];
        skippedByUser: string[];
        blockedTeam: string[];
        errors: string[];
    }>;
    /**
     * Read-only startup check for local/cloud skill drift.
     *
     * This is advisory UI only. Manual /download-skills and /upload-skills commands
     * still perform their own fresh comparison before writing anything.
     */
    checkSkillsSyncStatus?: () => Promise<SkillsSyncStatus>;
    onTelemetryChanged?: (enabled: boolean) => void;
    onProviderLoginStarted?: (providerId: string) => Promise<void> | void;
    onProviderLoginFailed?: (providerId: string, message: string) => Promise<void> | void;
    onProviderLoggedIn?: (providerId: string, userId?: string) => Promise<void> | void;
    onProviderLoggedOut?: (providerId: string) => Promise<void> | void;
}
//# sourceMappingURL=interactive-mode-options.d.ts.map