mcp-decisive
Version:
MCP server for WRAP decision-making framework with structured output
74 lines (68 loc) • 3.76 kB
JavaScript
export const ELICITATION_MESSAGES = {
MAIN_MESSAGE: (totalCount, reduceCount, options) => `💡 **選択肢の削減をお願いします**
【現状】${totalCount}個の選択肢が入力されました
【目標】**${reduceCount}個の選択肢を削除**して5個に調整してください
【選択肢一覧】
${options.map((opt, idx) => `${idx + 1}. ${opt.text}${opt.supplementaryInfo ? ` (${opt.supplementaryInfo})` : ''}`).join('\n')}
【削減の考え方】
• 重複している選択肢
• 実現可能性が低い選択肢
• 他の選択肢に包含される選択肢
• 現時点で優先度が明らかに低い選択肢
**あなたの判断で**削除する選択肢の番号をカンマ区切りで入力してください。
例: 削除したい選択肢が1番、3番、6番の場合 → "1,3,6"
**重要**: 正確に**${reduceCount}個**の番号を選択してください。`,
// バリデーション用
VALIDATION_ERROR: (selected, required) => `削除選択数エラー: ${selected}個選択されていますが、${required}個必要です。`,
PARSE_ERROR: (input) => `入力形式エラー: "${input}" は正しい形式ではありません。カンマ区切りの数値を入力してください(例: 1,3,5)`,
RANGE_ERROR: (invalidNumbers, max) => `範囲エラー: [${invalidNumbers.join(', ')}] は無効です。1-${max}の範囲で入力してください。`,
// 成功確認用
CONFIRMATION_MESSAGE: (removedOptions, remainingOptions) => `削除確認:
【削除対象】${removedOptions.join(', ')}
【残存選択肢】${remainingOptions.join(', ')}
この内容で削減を実行します。`
};
// レスポンス処理関数
export const parseElicitationResponse = (response, originalOptions) => {
if (!response || !response.selectedNumbers) {
return { success: false, error: 'ユーザーが削減をキャンセルしました' };
}
// 数値カンマ区切り文字列の解析
const input = response.selectedNumbers;
if (!input || typeof input !== 'string') {
return { success: false, error: ELICITATION_MESSAGES.PARSE_ERROR('') };
}
// カンマ区切りの数値解析
const numberStrings = input.split(',').map(s => s.trim());
const selectedNumbers = [];
for (const numStr of numberStrings) {
const num = parseInt(numStr);
if (isNaN(num)) {
return { success: false, error: ELICITATION_MESSAGES.PARSE_ERROR(input) };
}
selectedNumbers.push(num);
}
// 範囲チェック(1-based index)
const invalidNumbers = selectedNumbers.filter(num => num < 1 || num > originalOptions.length);
if (invalidNumbers.length > 0) {
return { success: false, error: ELICITATION_MESSAGES.RANGE_ERROR(invalidNumbers, originalOptions.length) };
}
// 重複チェック
const uniqueNumbers = [...new Set(selectedNumbers)];
if (uniqueNumbers.length !== selectedNumbers.length) {
return { success: false, error: '重複した番号が含まれています。' };
}
// 削除数バリデーション
const requiredRemovalCount = originalOptions.length - 5;
if (selectedNumbers.length !== requiredRemovalCount) {
return {
success: false,
error: ELICITATION_MESSAGES.VALIDATION_ERROR(selectedNumbers.length, requiredRemovalCount)
};
}
// 1-based から 0-based インデックスに変換してフィルタリング
const indicesToRemove = selectedNumbers.map(num => num - 1);
const filteredOptions = originalOptions.filter((_, index) => !indicesToRemove.includes(index));
return { success: true, filteredOptions };
};
//# sourceMappingURL=elicitation-prompts.js.map