/**
 * Chat Commands — read_chat node workspace scope guard.
 */
import type { CommandHelpers } from './handler.js';
/**
 * read_chat node scope verdict. One physical daemon hosts a base node plus several
 * worktree nodes; mesh_read_chat always dispatches read_chat with the requested
 * node's workspace (`args.workspace`). When the resolved target session actually
 * lives in a DIFFERENT worktree, returning its transcript — or worse, letting the
 * native-history-by-workspace fallback splice sibling worktree turns into the
 * reply — makes the coordinator believe one session received every worktree's
 * work. This guard refuses a CONFIRMED cross-workspace read instead of mixing.
 *
 * Conservative by design (mirrors the WTCLAIM fix-B "unknown → allow" rule): only
 * a session id that resolves to a known workspace which is unequal to a known
 * intended workspace blocks. When either side is unknown — no targetSessionId, no
 * args.workspace, an unregistered session, the coordinator self-session, or a
 * plain dashboard read that never passes a node workspace — the read proceeds
 * untouched, so base-node and same-daemon coordinator reads never regress.
 */
export declare function evaluateReadChatNodeWorkspaceScope(args: {
    targetSessionId?: string;
    intendedWorkspace?: string;
    sessionWorkspace?: string;
}): {
    scoped: false;
} | {
    scoped: true;
    intended: string;
    actual: string;
};
/**
 * Resolve the target session's ACTUAL workspace from the most authoritative source
 * available on this daemon: the session registry record (stamped at register
 * time), then the live CLI adapter's working directory, then the bound instance
 * state. Returns '' when nothing knows the session's workspace — the caller treats
 * that as "unknown" and does not block.
 */
export declare function resolveTargetSessionActualWorkspace(h: CommandHelpers, targetSessionId: string): string;
