import type { Clock } from '../infra/clock.js';
import type { FileSystem } from '../infra/filesystem.js';
import type { DomainEventBus } from '../shared/domainEvents.js';
import { type Result } from '../shared/result.js';
export type PipelineStatus = 'idle' | 'running' | 'stopping' | 'error';
export interface ProjectSummary {
    readonly name: string;
    readonly repoDir: string | null;
    readonly pmBackend: string;
    readonly agentProvider: string;
    readonly cards: {
        total: number;
        inprogress: number;
        done: number;
    };
    readonly workers: {
        total: number;
        active: number;
    };
    readonly pipelineStatus: PipelineStatus;
    readonly lastActivityAt: string | null;
}
export interface ConfContent {
    readonly content: string;
    readonly etag: string;
}
export interface ProjectInitExecutor {
    /**
     * 由 Phase 3 的 delivery 层注入。默认 container 未注入时 create() 会返 external 错误。
     * 拆出 port 是因为：
     *   - executeProjectInit 目前深度依赖 process.exit / 交互 readline，短期迁不进来
     *   - 重构期间保留命令层调 Service，Service 再回调命令层的 port 实现
     */
    init(project: string, opts: ProjectInitOpts): Promise<void>;
}
export interface ProjectInitOpts {
    projectDir: string;
    mergeBranch: string;
    maxWorkers: string;
    gitlabProject?: string;
    gitlabProjectId?: string;
    matrixRoomId?: string;
    /** v0.50.24：是否启用 git（false 时不写 GITLAB_* 到 conf，project.yaml 写 git: false） */
    enableGit?: boolean;
    /** v0.50.24：ACK 超时秒数（默认 300 = 5 分钟） */
    ackTimeoutS?: number;
    /** v0.51.0：启用 wiki/ 知识库（默认 false）。true → conf 写 WIKI_ENABLED=true 并自动 scaffold。 */
    enableWiki?: boolean;
    /** v0.51.6：projectDir 不存在时自动 mkdir -p（Console 表单创建路径默认 true） */
    createIfMissing?: boolean;
}
export interface CreateProjectInput extends ProjectInitOpts {
    name: string;
}
export interface DeleteProjectOpts {
    includeClaudeDir?: boolean;
}
export interface DeleteProjectReport {
    readonly name: string;
    readonly claudeRemoved: Array<{
        path: string;
        ok: boolean;
        error?: string;
    }>;
}
export interface ProjectServiceDeps {
    readonly fs: FileSystem;
    readonly clock: Clock;
    readonly events: DomainEventBus;
    readonly initExecutor?: ProjectInitExecutor;
}
export declare class ProjectService {
    private readonly deps;
    constructor(deps: ProjectServiceDeps);
    /** 列出 ~/.coral/projects/ 下所有项目的概览。 */
    list(): Promise<Result<ProjectSummary[]>>;
    /** 获取单个项目概览。找不到返 not-found。 */
    get(name: string): Promise<Result<ProjectSummary>>;
    /**
     * 创建项目。需要 ProjectInitExecutor 注入。
     * 已存在返 conflict。
     */
    create(input: CreateProjectInput): Promise<Result<ProjectSummary>>;
    /**
     * 删除项目。pipeline 在跑时拒绝（conflict）。
     * opts.includeClaudeDir 默认 true，也会删对应 repo 的 .claude/。
     */
    delete(name: string, opts?: DeleteProjectOpts): Promise<Result<DeleteProjectReport>>;
    /** 读 conf 文件 —— 返回 content + etag（SHA-256 前 16 位）。 */
    readConf(name: string): Promise<Result<ConfContent>>;
    /**
     * 写 conf —— etag 乐观锁。mismatch 返 conflict；内容相同 etag 不变。
     * 文件权限保持 0600（conf 可能含 secret）。
     */
    writeConf(name: string, content: string, etag: string): Promise<Result<{
        etag: string;
    }>>;
    private isValidName;
    private readSummary;
    private parseConf;
    /**
     * 卡片计数 —— 遍历 cards/<state>/*.md 子目录。
     * v0.49.15 修过同一个坑，现在统一走 runtimePaths + 在 service 层单点实现。
     */
    private countCards;
    /**
     * Worker marker 计数 —— 匹配双前缀 + 老单前缀两种格式（v0.49.16 之前遗留）。
     * 活跃判定：marker 最近 5 分钟内更新。
     */
    private countWorkers;
    private isPipelineRunning;
}
//# sourceMappingURL=ProjectService.d.ts.map