UNPKG

@emmahyde/thinking-patterns

Version:

MCP server combining systematic thinking, mental models, debugging approaches, and stochastic algorithms for comprehensive cognitive pattern support

124 lines (123 loc) 6.3 kB
import { BaseToolServer } from '../base/BaseToolServer.js'; import { DecisionFrameworkSchema } from '../schemas/index.js'; import { boxed } from '../utils/index.js'; /** * Decision Framework Server using thinking-patterns tools approach * Extends BaseToolServer for standardized validation and error handling */ export class DecisionFrameworkServer extends BaseToolServer { constructor() { super(DecisionFrameworkSchema); } handle(validInput) { return this.process(validInput); } /** * Standardized process method for decision framework * @param validInput - Validated decision framework data * @returns Processed decision framework result */ process(validInput) { // Format output using boxed utility const formattedOutput = this.formatDecisionOutput(validInput); // Log formatted output to console (suppress during tests) if (process.env.NODE_ENV !== 'test' && process.env.JEST_WORKER_ID === undefined) { console.error(formattedOutput); } return { decisionStatement: validInput.decisionStatement, decisionId: validInput.decisionId, analysisType: validInput.analysisType, stage: validInput.stage, iteration: validInput.iteration, nextStageNeeded: validInput.nextStageNeeded, options: validInput.options, criteria: validInput.criteria, stakeholders: validInput.stakeholders, constraints: validInput.constraints, timeHorizon: validInput.timeHorizon, riskTolerance: validInput.riskTolerance, possibleOutcomes: validInput.possibleOutcomes, criteriaEvaluations: validInput.criteriaEvaluations, informationGaps: validInput.informationGaps, sensitivityInsights: validInput.sensitivityInsights, expectedValues: validInput.expectedValues, multiCriteriaScores: validInput.multiCriteriaScores, recommendation: validInput.recommendation, suggestedNextStage: validInput.suggestedNextStage, status: 'success', optionCount: validInput.options.length, criteriaCount: validInput.criteria?.length ?? 0, hasStakeholders: !!validInput.stakeholders && validInput.stakeholders.length > 0, hasConstraints: !!validInput.constraints && validInput.constraints.length > 0, hasTimeHorizon: !!validInput.timeHorizon, hasRiskTolerance: !!validInput.riskTolerance, hasPossibleOutcomes: !!validInput.possibleOutcomes && validInput.possibleOutcomes.length > 0, hasCriteriaEvaluations: !!validInput.criteriaEvaluations && validInput.criteriaEvaluations.length > 0, hasInformationGaps: !!validInput.informationGaps && validInput.informationGaps.length > 0, hasSensitivityInsights: !!validInput.sensitivityInsights && validInput.sensitivityInsights.length > 0, hasExpectedValues: !!validInput.expectedValues && Object.keys(validInput.expectedValues).length > 0, hasMultiCriteriaScores: !!validInput.multiCriteriaScores && Object.keys(validInput.multiCriteriaScores).length > 0, hasRecommendation: !!validInput.recommendation, hasSuggestedNextStage: !!validInput.suggestedNextStage, timestamp: new Date().toISOString(), }; } formatDecisionOutput(data) { const sections = { 'Decision': data.decisionStatement, 'Analysis Type': data.analysisType.replace('-', ' ').toUpperCase(), 'Stage': data.stage.replace('-', ' ').toUpperCase(), 'Decision ID': data.decisionId, 'Iteration': data.iteration.toString() }; // Options if (data.options.length > 0) { sections['Options'] = data.options.map(option => `• ${option.name}: ${option.description}`); } // Criteria if (data.criteria && data.criteria.length > 0) { sections['Criteria'] = data.criteria.map(criterion => `• ${criterion.name} (weight: ${(criterion.weight * 100).toFixed(0)}%): ${criterion.description}`); } // Stakeholders if (data.stakeholders && data.stakeholders.length > 0) { sections['Stakeholders'] = data.stakeholders.map(stakeholder => `• ${stakeholder}`); } // Constraints if (data.constraints && data.constraints.length > 0) { sections['Constraints'] = data.constraints.map(constraint => `• ${constraint}`); } // Time horizon and risk tolerance if (data.timeHorizon) { sections['Time Horizon'] = data.timeHorizon; } if (data.riskTolerance) { sections['Risk Tolerance'] = data.riskTolerance.replace('-', ' ').toUpperCase(); } // Expected values if (data.expectedValues && Object.keys(data.expectedValues).length > 0) { sections['Expected Values'] = Object.entries(data.expectedValues).map(([option, value]) => `• ${option}: ${value.toFixed(3)}`); } // Multi-criteria scores if (data.multiCriteriaScores && Object.keys(data.multiCriteriaScores).length > 0) { sections['Multi-Criteria Scores'] = Object.entries(data.multiCriteriaScores).map(([option, score]) => `• ${option}: ${score.toFixed(3)}`); } // Information gaps if (data.informationGaps && data.informationGaps.length > 0) { sections['Information Gaps'] = data.informationGaps.map(gap => `• ${gap.description} (impact: ${(gap.impact * 100).toFixed(0)}%)`); } // Sensitivity insights if (data.sensitivityInsights && data.sensitivityInsights.length > 0) { sections['Sensitivity Insights'] = data.sensitivityInsights.map(insight => `• ${insight}`); } // Recommendation if (data.recommendation) { sections['Recommendation'] = data.recommendation; } // Suggested next stage if (data.suggestedNextStage) { sections['Suggested Next Stage'] = data.suggestedNextStage; } return boxed('📊 Decision Framework', sections); } }