export type Kind = 'note' | 'log' | 'idea' | 'task' | 'issue' | 'image' | 'concept' | 'session' | 'goal' | 'collection' | 'project' | 'space' | 'book' | 'highlight' | 'article' | 'person' | 'post' | 'comment' | 'equation' | 'video' | 'question' | 'review' | 'aichat' | 'aiprompt' | 'airesponse' | 'self';
export type Keyword = 'head' | 'id' | 'kind' | 'name' | 'content' | 'in' | 'by' | 'draft' | 'archived' | 'deleted' | 'done' | 'todo' | 'created' | 'updated' | 'changed' | 'date' | 'time' | 'sort' | 'limit' | 'today' | 'yesterday' | Kind;
interface BaseTok {
    from: number;
    to: number;
    raw: string;
}
/** single calendar points */
export type DatePointUtility = {
    util: 'today';
} | {
    util: 'yesterday';
};
/** closed interval ending “now” */
export type DateRangeUtility = {
    util: 'last';
    unit: 'days' | 'weeks' | 'months' | 'years';
    n: number;
};
export type DateUtility = DatePointUtility | DateRangeUtility;
export type DateValue = {
    y: number;
    m?: number;
    d?: number;
};
export type TimeValue = {
    h: number;
    m?: number;
    clock: '24h' | '12h';
};
export type DateTimeValue = {
    y: number;
    m: number;
    d: number;
    h: number;
    min: number;
};
export type TimestampValue = DateValue | TimeValue | DateTimeValue | Cmp<DateValue | TimeValue | DateTimeValue>;
export type CmpOp = '<' | '>';
export type LexToken = ({
    kind: 'date';
    op?: CmpOp;
    value: DateValue;
} & BaseTok) | ({
    kind: 'time';
    op?: CmpOp;
    value: TimeValue;
} & BaseTok) | ({
    kind: 'datetime';
    op?: CmpOp;
    value: DateTimeValue;
} & BaseTok) | ({
    kind: 'dateutil';
    op?: CmpOp;
    value: DateUtility;
} & BaseTok) | ({
    kind: 'boolean';
    value: boolean;
} & BaseTok) | ({
    kind: 'uuid';
    value: string;
    deep: boolean;
} & BaseTok) | ({
    kind: 'string';
    value: string;
} & BaseTok);
export type MicroParser = (word: string, pos: number) => LexToken | null;
export interface ParsedKeyword<K extends Keyword = Keyword, V = unknown> {
    keyword: K;
    parsed: V;
    from: number;
    to: number;
    raw: string;
}
export type Cmp<V> = {
    op: CmpOp;
    value: V;
};
export interface InArg {
    id: string;
    deep: boolean;
}
export interface ByArg {
    id: string;
}
export interface SortArg {
    field: string;
    dir?: 'asc' | 'desc';
}
export interface ParseError {
    from: number;
    to: number;
    message: string;
    token: string;
}
export interface ParseResult {
    segments: Segment[];
    keywords: ParsedKeyword[];
    errors: ParseError[];
}
export interface Segment {
    keyword: 'head' | string;
    tokens: LexToken[];
    errors: ParseError[];
    from: number;
    to: number;
    body: string;
    raw: string;
    ignored: boolean;
}
export {};
