import type { PackageManagerKind } from "../../package-manager.js";
import { type NodeEngineOverride } from "../../node-engine.js";
import { type EvePackageContract } from "../create/project.js";
export declare const SLACK_CHANNEL_DEFAULT_ROUTE = "/eve/v1/slack";
export declare const DEFAULT_SLACK_CONNECTOR_SLUG = "my-agent";
declare const slackConnectorSlugBrand: unique symbol;
export type ChannelKind = "slack" | "web";
export type SlackConnectorSlug = string & {
    readonly [slackConnectorSlugBrand]: true;
};
export interface PackageJsonMutation {
    path: string;
    dependencies: string[];
    devDependencies: string[];
    scripts: string[];
}
export type ChannelMutationAction = "created" | "overwritten" | "skipped";
export type ChannelMutationResult = SlackChannelMutationResult | WebChannelMutationResult;
interface SlackChannelWrittenResult {
    kind: "slack";
    action: "created" | "overwritten";
    filesWritten: [string];
    filesOverwritten?: [string];
    filesSkipped: [];
    packageJsonUpdated: PackageJsonMutation[];
    slackConnectorSlug: SlackConnectorSlug;
}
interface SlackChannelSkippedResult {
    kind: "slack";
    action: "skipped";
    filesWritten: [];
    filesOverwritten?: [];
    filesSkipped: [string];
    packageJsonUpdated: [];
}
type SlackChannelMutationResult = SlackChannelWrittenResult | SlackChannelSkippedResult;
interface WebChannelWrittenResult {
    kind: "web";
    action: "created" | "overwritten";
    filesWritten: string[];
    filesOverwritten?: string[];
    competingNextConfigFiles?: string[];
    nodeEngineOverride?: NodeEngineOverride;
    filesSkipped: string[];
    packageJsonUpdated: PackageJsonMutation[];
}
interface WebChannelSkippedResult {
    kind: "web";
    action: "skipped";
    skipReason: "nextjs-project";
    filesWritten: [];
    filesOverwritten?: [];
    filesSkipped: [string];
    packageJsonUpdated: [];
}
type WebChannelMutationResult = WebChannelWrittenResult | WebChannelSkippedResult;
/**
 * Whether the project already carries a Next.js app: `package.json` declares a
 * `next` dependency in the same dependency fields Vercel framework detection
 * checks. This is the exact predicate the
 * web scaffold skips on (`skipReason: "nextjs-project"`), so pickers can mark
 * Web Chat as already present precisely when scaffolding would be a no-op.
 * A missing `package.json` reads as "no app".
 */
export declare function isNextJsProject(projectRoot: string): Promise<boolean>;
/**
 * Whether the root app declares a Vercel framework that should own the
 * top-level deployment while eve runs as a sibling service. These match Eve's
 * current framework integrations: Next.js, Nuxt, and SvelteKit.
 */
export declare function hasVercelHostFramework(projectRoot: string): Promise<boolean>;
export declare function normalizeSlackConnectorSlug(input: string): SlackConnectorSlug;
export declare function deriveSlackConnectorSlug(projectRoot: string, projectNameHint?: string): Promise<SlackConnectorSlug>;
export interface EnsureChannelOptions {
    projectRoot: string;
    kind: ChannelKind;
    /** Manager that owns generated project configuration. Defaults to pnpm. */
    packageManager?: PackageManagerKind;
    force?: boolean;
    /** Exact UID returned by Vercel Connect; takes precedence over the derived slug. */
    slackConnectorUid?: string;
    slackConnectorSlug?: SlackConnectorSlug;
    connectPackageVersion?: string;
    webPackageVersions?: WebPackageVersions;
    /** When false, Web Chat leaves Vercel Services config unwritten for preview-only scaffolds. */
    configureVercelServices?: boolean;
}
export interface WebPackageVersions {
    evePackage?: EvePackageContract;
    aiPackageVersion?: string;
    nextPackageVersion?: string;
    reactPackageVersion?: string;
    reactDomPackageVersion?: string;
    streamdownPackageVersion?: string;
    zodPackageVersion?: string;
    typesReactPackageVersion?: string;
    typesReactDomPackageVersion?: string;
}
export declare function ensureChannel(options: EnsureChannelOptions): Promise<ChannelMutationResult>;
export declare function listAuthoredChannels(projectRoot: string): Promise<string[]>;
export {};
