export declare function isImagePath(p: string): boolean;
/** Dedicated exit code for "the reporter thread exists and delivery FAILED".
*
* Deliberately NOT 1: 1 is argument/validation failure, and a caller must be
* able to tell "you invoked me wrong" from "the upload broke". Joins the
* documented set in CONTRIBUTING.md (3/4/5/6/7/10). */
export declare const EXIT_EVIDENCE_THREAD_FAILED = 11;
export interface EvidenceThreadVerdict {
/** exit code to use: 0 for delivered / no-reporter-thread. */
exitCode: number;
/** Line to print. stderr when `isError`, stdout otherwise. */
note: string;
isError: boolean;
/** Some artifacts reached the thread and at least one did not. Still an
* error (exit 11) — but the operator must not resend what already landed. */
partial: boolean;
}
/**
* Decide what `issue evidence` says and exits on the reporter-thread outcome.
*
* `status` undefined = a server older than 0.30 that predates the field; fall
* back to the legacy bool, which cannot distinguish the two cases — so treat it
* as absence (the pre-existing, non-breaking behaviour) rather than inventing a
* failure that would break every non-chat project.
*
* `failed` covers two different operator situations, and `threadNotified` is
* what separates them (PR #463 review): the server sets it the moment ANY
* artifact lands, so `failed` + `threadNotified:true` is a PARTIAL upload —
* some shots are already in the reporter's thread. Saying "the reporter was NOT
* notified" there is false, and it pushes the operator into re-sending
* artifacts the reporter can already see. Both stay exit 11: an incomplete
* evidence set is still a failure to know about.
*/
export declare function evidenceThreadVerdict(status: string | undefined, threadNotified: boolean, threadError?: string): EvidenceThreadVerdict;
/**
* Validate a before/after evidence selection. Returns an error message, or null
* when the selection is acceptable. Pure (no I/O) so it's unit-testable.
*
* Rules:
* - `before` and `after` must be provided together (one without the other fails).
* - Counts must MATCH: before[i] pairs with after[i], and a multi-surface change
* attaches one pair per surface — mismatched counts can't pair.
* - `labels` name the pairs by index; more labels than pairs is a mistake.
* - `beforeCaptions`/`afterCaptions`/`imageCaptions` describe individual shots by
* position (caption[i] → the i-th before/after/misc file); more captions than
* files in a group is a mistake. A per-shot caption keeps a blanket summary
* from over-claiming what one image shows (issue #301).
* - If neither is given but image files were passed via `misc` (--file/--image),
* that's rejected — screenshots must go through --before/--after (or `actual`
* for a bug with no fix yet).
* - Video-only / non-image `misc` (e.g. an mp4) may be attached alone.
* - `actual` (--actual) is DEFECT capture: the broken state of a bug that has no
* fix yet, so there is nothing to pair it with. Legal on its own, may ride with
* `misc`, and mutually exclusive with before/after — once a fix exists, the
* pair is what proves it (issue #417).
*/
export declare function validateEvidenceSelection(before: string[], after: string[], misc: string[], labels?: string[], beforeCaptions?: string[], afterCaptions?: string[], imageCaptions?: string[], actual?: string[], actualCaptions?: string[]): string | null;
/** Server-side per-file cap (cli_handler.go maxEvidenceFileBytes), mirrored so
* the CLI can refuse an oversized recording BEFORE buffering it into memory. */
export declare const MAX_SCREENSHOT_BYTES: number;
export declare function isVideoPath(p: string): boolean;
/**
* Validate the media selection for `issue create --screenshot`. Returns an
* error message, or null when acceptable. Pure (no I/O) so it's unit-testable.
* Unlike evidence, there is no before/after pairing — these shots DOCUMENT the
* problem being reported, not a fix — but each file must be a known image or
* video type (the blob host serves by content type, and GitHub only renders
* known media), and captions describe shots by position, at most one each.
*/
export declare function validateScreenshotSelection(paths: string[], captions: string[]): string | null;
/**
* Render the `## Screenshots` section appended to a new issue's body: one
* hosted embed per file (an
, or a