Files
pi-ask/src/config/schema.ts
T

78 lines
1.9 KiB
TypeScript

import { type Static, Type } from "typebox";
import { Compile } from "typebox/compile";
const AskAnswerModelPreferenceSchema = Type.Object({
id: Type.String(),
provider: Type.String(),
});
export const AskConfigFileV2Schema = Type.Object({
schemaVersion: Type.Literal(2),
answer: Type.Optional(
Type.Object({
extractionModels: Type.Optional(
Type.Array(AskAnswerModelPreferenceSchema)
),
extractionRetries: Type.Optional(Type.Number()),
extractionTimeoutMs: Type.Optional(Type.Number()),
})
),
behaviour: Type.Optional(
Type.Object({
autoSubmitWhenAnsweredWithoutNotes: Type.Optional(Type.Boolean()),
confirmDismissWhenDirty: Type.Optional(Type.Boolean()),
doublePressReviewShortcuts: Type.Optional(Type.Boolean()),
showFooterHints: Type.Optional(Type.Boolean()),
})
),
keymaps: Type.Optional(
Type.Object({
cancel: Type.Optional(Type.String()),
confirm: Type.Optional(Type.String()),
dismiss: Type.Optional(Type.String()),
optionNote: Type.Optional(Type.String()),
questionNote: Type.Optional(Type.String()),
toggle: Type.Optional(Type.String()),
})
),
});
export type AskConfigFileV2 = Static<typeof AskConfigFileV2Schema>;
export type AskConfigFileV1 = Omit<
AskConfigFileV2,
"answer" | "schemaVersion"
> & {
schemaVersion: 1;
};
export interface AskAnswerModelPreference {
id: string;
provider: string;
}
export interface AskConfigKeymaps {
cancel: string;
confirm: string;
dismiss: string;
optionNote: string;
questionNote: string;
toggle: string;
}
export interface AskConfig {
answer: {
extractionModels: AskAnswerModelPreference[];
extractionRetries: number;
extractionTimeoutMs: number;
};
behaviour: {
autoSubmitWhenAnsweredWithoutNotes: boolean;
confirmDismissWhenDirty: boolean;
doublePressReviewShortcuts: boolean;
showFooterHints: boolean;
};
keymaps: AskConfigKeymaps;
}
export const validateAskConfigFileV2 = Compile(AskConfigFileV2Schema);