/**
 * ParallelWorkSentinel — the proactive overlap councilor (Parallel-Work Awareness
 * Phase B; docs/specs/parallel-activity-coherence.md, Part 2).
 *
 * On a cadence it reads the cross-topic activity index, runs the pure overlap detector,
 * and — for genuinely-fresh overlaps — emits ONE 'overlap' nudge so the agent learns its
 * other hand is already on the same work (the willpower-trap fix: the signal comes TO the
 * agent, it doesn't rely on the agent remembering to query). SIGNAL-ONLY — it never gates,
 * blocks, or mutates anything.
 *
 * Convergence-mandated containment (a noisy councilor gets muted, which is worse than
 * silence), all enforced here statefully on top of the pure detector's containment:
 *  - PAIR-KEYED COOLDOWN: at most one nudge per (topicA,topicB) per `nudgeCooldownMs`
 *    (default 60min) — survives focus edits, so responding to a nudge can't re-trigger it.
 *  - SIGNATURE HYSTERESIS: within the cooldown, a re-nudge only fires if the shared-tag SET
 *    changed materially (a genuinely new overlap), not on a one-token focus tweak.
 *  - It is the LEASE-HOLDER's job to run this (the caller gates ticks on holdsLease) so the
 *    same overlap isn't nudged twice from two machines.
 *
 * Ships DARK (the route/config default is enabled:false) — graduate after it's proven quiet.
 */
import { EventEmitter } from 'node:events';
import { type OverlapCandidate, type OverlapPair } from './ParallelWorkOverlap.js';
export interface ParallelWorkSentinelOptions {
    /** Pull the current cross-topic activities (e.g. ParallelActivityIndex.activities()). */
    getActivities: (nowMs: number) => OverlapCandidate[];
    /** Min ms between nudges for the same topic pair (default 60min). */
    nudgeCooldownMs?: number;
    /** Only compare topics worked within this window (passed to the detector; default 4h). */
    activityWindowMs?: number;
    /** Require ≥ this many shared high-specificity tags (default 1). */
    minSharedSpecific?: number;
    /** Audit sink for every transition (detected/nudged/deduped) — default-on housekeeping. */
    audit?: (event: ParallelWorkAuditEvent) => void;
}
export interface ParallelWorkAuditEvent {
    kind: 'nudged' | 'deduped-cooldown' | 'deduped-hysteresis';
    pair: OverlapPair;
    atMs: number;
}
/** Emitted to the agent when a fresh overlap is found. The one user-facing signal. */
export interface OverlapNudge {
    pair: OverlapPair;
    atMs: number;
    message: string;
}
export interface ParallelWorkSentinelEvents {
    overlap: [nudge: OverlapNudge];
}
export declare class ParallelWorkSentinel extends EventEmitter {
    private readonly opts;
    private readonly state;
    constructor(opts: ParallelWorkSentinelOptions);
    /** Run one cadence tick. Pure-ish: side effects are the emitted nudges + the audit sink. */
    tick(nowMs: number): OverlapNudge[];
    /** Test/inspection helper: how many pairs are being tracked for dedup. */
    trackedPairCount(): number;
}
//# sourceMappingURL=ParallelWorkSentinel.d.ts.map