import type { AgentTool, ExecutionEnv } from "../../internal/harness-types.js";
import { type RootsSeat } from "./safety.js";
import { type ReadDenyMatcher } from "./read-deny.js";
import type { ContainmentFace } from "./containment-face.js";
import type { CwdRef } from "./fs-shared.js";
/**
 * The Grep card's details assembly, PURE over the engine text ({mode, offset} from the request) —
 * exported so the text→structured mapping is pinnable with synthetic texts (the byte-truncation and
 * fenced-partial shapes are impractical to construct through a live tool call). PATH IDENTITY comes
 * off the engines' served rows, not the text (both legs supply them); the counts and totals below
 * still read the engine's own honesty markers out of the text, which is what keeps this seam the
 * honesty boundary.
 */
export declare function grepDetailFields(text: string, mode: "files_with_matches" | "content" | "count", offset?: number, structuredRows?: readonly import("./search.js").GrepRow[]): Record<string, unknown>;
export declare function createGrepTool(env: ExecutionEnv, rootCanonical: string, rootsSeat?: RootsSeat, denySeat?: ReadDenyMatcher, readFace?: ContainmentFace, cwdRef?: CwdRef, readAdmission?: (toolCallId: string | undefined, canonicalKey: string) => boolean): AgentTool;
export declare function createGlobTool(env: ExecutionEnv, rootCanonical: string, rootsSeat?: RootsSeat, denySeat?: ReadDenyMatcher, readFace?: ContainmentFace, cwdRef?: CwdRef, readAdmission?: (toolCallId: string | undefined, canonicalKey: string) => boolean): AgentTool;
