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 any dependency field. 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; export declare function normalizeSlackConnectorSlug(input: string): SlackConnectorSlug; export declare function deriveSlackConnectorSlug(projectRoot: string, projectNameHint?: string): Promise; 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; export declare function listAuthoredChannels(projectRoot: string): Promise; export {};