/** * Ephemeral, per-thread "detail grant" — an operator-side opt-in that lets the * agent's next long report_progress bubble bypass the hard length cap. * * This is the ONE trustworthy verbosity signal: it is set by an operator * `/detail` command that the SERVER sees (poller.ts), never by a flag the agent * sets on itself. A bare `detailed:true` is now ignored — the length check only * relaxes while a grant is live. Semantics: "next long message OR N minutes, * whichever comes first" — consumed when the first over-cap message passes, else * it expires. * * Deliberately in-memory only: a ~30-minute grant surviving a server restart has * no value, so it is never persisted to settings.json. */ /** Length of a granted window, in minutes. Configurable via DETAIL_GRANT_MINUTES. */ export declare const DETAIL_GRANT_MINUTES: number; /** * Open a detail window for a thread: valid until the next long message or * DETAIL_GRANT_MINUTES from now, whichever comes first. Overwrites any existing * grant (a fresh `/detail` restarts the clock). */ export declare function grantDetailWindow(threadId: number, nowMs?: number): void; /** Drop a thread's grant immediately (operator `/detail off`). Idempotent. */ export declare function revokeDetailGrant(threadId: number): void; /** * Non-consuming peek: is there a live (unexpired) grant for this thread? Lazily * evicts an expired entry so the Map never accumulates stale grants. * * `nowMs` defaults to `Date.now()`; it is injectable purely so the window's * expiry is testable without stubbing the clock. */ export declare function isDetailGrantActive(threadId: number, nowMs?: number): boolean; /** * Consume the grant: if active, delete it and return true (one long message is * allowed through). If inactive or expired, return false and leave nothing * behind. One-shot — a second long message needs a fresh `/detail`. */ export declare function consumeDetailGrant(threadId: number, nowMs?: number): boolean; //# sourceMappingURL=detail-grant.d.ts.map