eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
84 lines (83 loc) • 3.52 kB
TypeScript
import { Prompt } from "@clack/core";
import { type PromptOption, type PromptValue } from "./prompt-ui.js";
import { type SelectState } from "./select-state.js";
/**
* A prompt's live status note (e.g. a two-stage quit guard), read on each
* render. Returns `undefined` when there is nothing to show. Wired in by
* {@link runSelectComponent} via its `attachGuard` hook.
*/
export interface SelectGuard {
note(): string | undefined;
}
/**
* Custom `@clack/core` `Prompt` backing every select picker. It adapts key
* events to {@link reduceSelect} transitions and tracks the resolved value: the
* highlighted option for single-select, the marked set for multi-select.
* Filtering, multi-selection, and the cursor arrow are all driven by the
* `search` and `multiple` flags, so one component covers every picker.
*/
export declare class SelectComponent extends Prompt<string | string[]> {
readonly options: PromptOption<string>[];
readonly multiple: boolean;
readonly search: boolean;
readonly required: boolean;
filter: string;
optionCursor: number;
selectedSet: Set<string>;
constructor(input: {
options: PromptOption<string>[];
multiple: boolean;
search: boolean;
required: boolean;
initial: SelectState;
render: (this: Omit<SelectComponent, "prompt">) => string | undefined;
});
visibleOptions(): PromptOption<string>[];
/** True when the multi-select cursor sits on the trailing Submit row. */
onSubmitRow(): boolean;
/**
* Submit-row label: "Skip" while an optional checklist has nothing picked,
* "Submit" as soon as one row is marked. Locked rows are mandatory rather
* than chosen, so they do not count as a pick; a required checklist always
* says "Submit" since an empty confirm cannot resolve it.
*/
submitLabel(): "Submit" | "Skip";
/**
* Enter resolves an actionable single-select row; completed rows are
* focus-only. A multi-select resolves only from its Submit row — on any
* option row it toggles instead, so enter can never accidentally skip the
* checklist.
*/
protected _shouldSubmit(): boolean;
/** Values that should render as chosen: the marked set, or the cursor for single. */
selectedValues(): string[];
/** The folded answer shown once the prompt resolves. */
submitDisplay(): string;
labelForValue(value: string): string;
submitError(): string | undefined;
private apply;
private refreshValue;
}
/**
* Runs one select picker and resolves to the chosen value(s), or a clack cancel
* symbol when the prompt is cancelled (the caller maps that to its own error).
* Single-select returns the highlighted value, multi-select the marked set.
*
* Option values round-trip through opaque string keys so values of different
* primitive types cannot collide. `attachGuard` wires
* extra key handling (e.g. a two-stage quit guard) and supplies the live footer
* note; `leadingRail` colors the leader rail white for the first prompt in a
* sequence and green thereafter.
*/
export declare function runSelectComponent<T extends PromptValue>(input: {
message: string;
options: readonly PromptOption<T>[];
multiple: boolean;
search: boolean;
required: boolean;
placeholder?: string;
defaultValue?: T;
initialValues?: readonly T[];
leadingRail: "white" | "green";
attachGuard?: (prompt: SelectComponent) => SelectGuard;
}): Promise<T | T[] | symbol>;