/**
 * ParallelActivityIndex — a thin CROSS-topic read aggregator over the EXISTING
 * Topic-Intent Layer (docs/specs/parallel-activity-coherence.md, Phase A).
 *
 * It does NOT introduce a new per-topic store (convergence: that would duplicate
 * TopicIntentStore/TopicIntentCapture/briefing/decay). It only READS the existing
 * per-topic intent files and presents a cross-topic view — "all my topics + what
 * each is currently working on" — which is the thing that genuinely did not exist.
 * This view feeds the GET /parallel-work/activities surface and (Phase B) the
 * ParallelWorkSentinel's overlap comparison. Signal-only; never gates or mutates.
 */
import { type EstablishedRef } from './TopicIntent.js';
/** A topic's current parallel-work snapshot, derived from its intent refs. */
export interface TopicActivity {
    topicId: number;
    /** One-line current focus: the highest-tier goal, else the latest decision, else null. */
    focus: string | null;
    /** High-specificity tokens (entities/files/identifiers) for cheap overlap matching. */
    tags: string[];
    /** Count of established refs at/above the 'tentative' tier (how "settled" the topic is). */
    refCount: number;
    /** Most recent reinforcement across the topic's refs (freshness; null if unknown). */
    updatedAt: number | null;
}
/**
 * Extract high-specificity tokens from free text: identifiers, file paths, branch-ish
 * names, camelCase/kebab/snake words, and rare ≥4-char words — minus boilerplate. Bare
 * generic words are dropped so two topics that merely both say "fix the test" don't match.
 */
export declare function extractTags(text: string): string[];
export interface ParallelActivityIndexOptions {
    stateDir: string;
    /** Optional: resolve a topic's one-line purpose (e.g. TopicMemory.purpose) as a focus fallback. */
    purposeFor?: (topicId: number) => string | null | undefined;
    /** Optional: is a session/autonomous job live on this topic right now? */
    isRunning?: (topicId: number) => boolean;
    /** Optional: a human nickname for the topic. */
    nicknameFor?: (topicId: number) => string | null | undefined;
    /**
     * Optional refs provider seam (testability + wiring-integrity). Defaults to the
     * real TopicIntentStore.getRefsAtOrAbove(topicId,'tentative'). Production never
     * sets this; tests inject controlled refs without fighting projectConfidence.
     */
    getRefs?: (topicId: number, nowMs: number) => EstablishedRef[];
}
export declare class ParallelActivityIndex {
    private readonly opts;
    private readonly store;
    private readonly intentDir;
    constructor(opts: ParallelActivityIndexOptions);
    /** Enumerate every topic that has an intent file. */
    listTopicIds(): number[];
    /** Build the cross-topic snapshot. nowMs lets tests pin time; defaults to live. */
    activities(nowMs?: number): Array<TopicActivity & {
        nickname: string | null;
        running: boolean;
    }>;
    private safeRefs;
    /** Focus = most-recently-reinforced goal text, else the latest decision, else purpose, else null. */
    private deriveFocus;
}
//# sourceMappingURL=ParallelActivityIndex.d.ts.map