- Split 25+ index.ts files into hook.ts + extracted modules - Rename all catch-all utils.ts/helpers.ts to domain-specific names - Split src/tools/lsp/ into ~15 focused modules - Split src/tools/delegate-task/ into ~18 focused modules - Separate shared types from implementation - 155 files changed, 60+ new files created - All typecheck clean, 61 tests pass
63 lines
1.5 KiB
TypeScript
63 lines
1.5 KiB
TypeScript
const MAX_LABEL_LENGTH = 30;
|
|
|
|
interface QuestionOption {
|
|
label: string;
|
|
description?: string;
|
|
}
|
|
|
|
interface Question {
|
|
question: string;
|
|
header?: string;
|
|
options: QuestionOption[];
|
|
multiSelect?: boolean;
|
|
}
|
|
|
|
interface AskUserQuestionArgs {
|
|
questions: Question[];
|
|
}
|
|
|
|
function truncateLabel(label: string, maxLength: number = MAX_LABEL_LENGTH): string {
|
|
if (label.length <= maxLength) {
|
|
return label;
|
|
}
|
|
return label.substring(0, maxLength - 3) + "...";
|
|
}
|
|
|
|
function truncateQuestionLabels(args: AskUserQuestionArgs): AskUserQuestionArgs {
|
|
if (!args.questions || !Array.isArray(args.questions)) {
|
|
return args;
|
|
}
|
|
|
|
return {
|
|
...args,
|
|
questions: args.questions.map((question) => ({
|
|
...question,
|
|
options:
|
|
question.options?.map((option) => ({
|
|
...option,
|
|
label: truncateLabel(option.label),
|
|
})) ?? [],
|
|
})),
|
|
};
|
|
}
|
|
|
|
export function createQuestionLabelTruncatorHook() {
|
|
return {
|
|
"tool.execute.before": async (
|
|
input: { tool: string },
|
|
output: { args: Record<string, unknown> }
|
|
): Promise<void> => {
|
|
const toolName = input.tool?.toLowerCase();
|
|
|
|
if (toolName === "askuserquestion" || toolName === "ask_user_question") {
|
|
const args = output.args as unknown as AskUserQuestionArgs | undefined;
|
|
|
|
if (args?.questions) {
|
|
const truncatedArgs = truncateQuestionLabels(args);
|
|
Object.assign(output.args, truncatedArgs);
|
|
}
|
|
}
|
|
},
|
|
};
|
|
}
|