/**
 * FeatureAgentLifecyclePublisher
 *
 * Thin wrapper around {@link SendAgentMessageUseCase} so the feature-agent
 * worker can broadcast lifecycle messages (started, phase-changed, blocked,
 * completed) on the agent message bus without touching bus internals or
 * the feature-flag check (the use case owns both).
 *
 * Scope derivation: messages are scoped by `appId`. We try to resolve a
 * registered {@link Application} for the worker's repository path; if none
 * exists we use the repository path itself as the stable scope key. This
 * keeps cross-worktree messages consistent without requiring the Feature
 * model to know about Applications.
 *
 * Failures are swallowed: the lifecycle publisher must NOT crash a feature
 * agent if the bus is unavailable. The worker logs each lifecycle event
 * separately for crash diagnosis.
 */
import type { IApplicationRepository } from '../../../../application/ports/output/repositories/application-repository.interface.js';
import { SendAgentMessageUseCase } from '../../../../application/use-cases/agents/send-agent-message.use-case.js';
interface BaseInput {
    runId: string;
    featureId: string;
    repositoryPath: string;
}
export interface PhaseChangedInput extends BaseInput {
    phase: string;
}
export interface BlockedInput extends BaseInput {
    reason: string;
}
export declare class FeatureAgentLifecyclePublisher {
    private readonly sendAgentMessage;
    private readonly applicationRepo;
    constructor(sendAgentMessage: SendAgentMessageUseCase, applicationRepo: IApplicationRepository);
    publishStarted(input: BaseInput): Promise<void>;
    publishPhaseChanged(input: PhaseChangedInput): Promise<void>;
    publishBlocked(input: BlockedInput): Promise<void>;
    publishCompleted(input: BaseInput): Promise<void>;
    private publish;
    private resolveAppId;
}
export {};
//# sourceMappingURL=feature-agent-lifecycle-publisher.d.ts.map