/**
 * Jj integration for the semantic graph.
 *
 * Every event in the log is tagged with the jj change ID active when it was
 * written. Replay filters by jj ancestry of the current HEAD — this is how
 * branch/rebase/amend safety works without per-branch anchor forking.
 *
 * See `.indusk/planning/cgc-graphiti-bridge/adr.md` Decision #2.
 */
/**
 * Thrown when the sync pipeline runs in a directory that isn't a jj repo or
 * when `jj` is not on PATH. Callers decide whether to fail hard or fall back.
 * v1 fails hard — the semantic graph bridge requires jj as its versioning
 * substrate; a git-only fallback is future work.
 */
export declare class NotAJjRepoError extends Error {
    constructor(cwd: string, cause?: unknown);
}
type JjRunner = (args: string[], cwd: string) => Promise<string>;
/** Override the jj runner. Tests use this to inject canned output. */
export declare function setJjRunner(next: JjRunner): void;
/** Reset to the real jj runner. Tests call this in afterEach. */
export declare function resetJjRunner(): void;
/**
 * Return the jj change ID of the current working-copy change (`@`).
 *
 * This is the ID that should be stamped on every event produced during this
 * session until the user runs `jj new`.
 */
export declare function getCurrentChangeId(cwd: string): Promise<string>;
/**
 * Return the set of change IDs reachable from the current HEAD — i.e. the
 * current change and all its ancestors. This is the ancestry filter that
 * replay uses to decide which events apply to the current view of the graph.
 *
 * Equivalent to `jj log -r '::@'`. Excludes any events tagged with change IDs
 * that are not ancestors of HEAD (sibling branches, abandoned work).
 */
export declare function getReachableChangeIds(cwd: string): Promise<Set<string>>;
/** Convenience: is this change ID in the reachable set? */
export declare function isChangeReachable(changeId: string, reachable: Set<string>): boolean;
export {};
