@machinespirits/eval 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/components/MobileEvalDashboard.tsx +267 -0
  2. package/components/comparison/DeltaAnalysisTable.tsx +137 -0
  3. package/components/comparison/ProfileComparisonCard.tsx +176 -0
  4. package/components/comparison/RecognitionABMode.tsx +385 -0
  5. package/components/comparison/RecognitionMetricsPanel.tsx +135 -0
  6. package/components/comparison/WinnerIndicator.tsx +64 -0
  7. package/components/comparison/index.ts +5 -0
  8. package/components/mobile/BottomSheet.tsx +233 -0
  9. package/components/mobile/DimensionBreakdown.tsx +210 -0
  10. package/components/mobile/DocsView.tsx +363 -0
  11. package/components/mobile/LogsView.tsx +481 -0
  12. package/components/mobile/PsychodynamicQuadrant.tsx +261 -0
  13. package/components/mobile/QuickTestView.tsx +1098 -0
  14. package/components/mobile/RecognitionTypeChart.tsx +124 -0
  15. package/components/mobile/RecognitionView.tsx +809 -0
  16. package/components/mobile/RunDetailView.tsx +261 -0
  17. package/components/mobile/RunHistoryView.tsx +367 -0
  18. package/components/mobile/ScoreRadial.tsx +211 -0
  19. package/components/mobile/StreamingLogPanel.tsx +230 -0
  20. package/components/mobile/SynthesisStrategyChart.tsx +140 -0
  21. package/config/interaction-eval-scenarios.yaml +832 -0
  22. package/config/learner-agents.yaml +248 -0
  23. package/docs/research/ABLATION-DIALOGUE-ROUNDS.md +52 -0
  24. package/docs/research/ABLATION-MODEL-SELECTION.md +53 -0
  25. package/docs/research/ADVANCED-EVAL-ANALYSIS.md +60 -0
  26. package/docs/research/ANOVA-RESULTS-2026-01-14.md +257 -0
  27. package/docs/research/COMPREHENSIVE-EVALUATION-PLAN.md +586 -0
  28. package/docs/research/COST-ANALYSIS.md +56 -0
  29. package/docs/research/CRITICAL-REVIEW-RECOGNITION-TUTORING.md +340 -0
  30. package/docs/research/DYNAMIC-VS-SCRIPTED-ANALYSIS.md +291 -0
  31. package/docs/research/EVAL-SYSTEM-ANALYSIS.md +306 -0
  32. package/docs/research/FACTORIAL-RESULTS-2026-01-14.md +301 -0
  33. package/docs/research/IMPLEMENTATION-PLAN-CRITIQUE-RESPONSE.md +1988 -0
  34. package/docs/research/LONGITUDINAL-DYADIC-EVALUATION.md +282 -0
  35. package/docs/research/MULTI-JUDGE-VALIDATION-2026-01-14.md +147 -0
  36. package/docs/research/PAPER-EXTENSION-DYADIC.md +204 -0
  37. package/docs/research/PAPER-UNIFIED.md +659 -0
  38. package/docs/research/PAPER-UNIFIED.pdf +0 -0
  39. package/docs/research/PROMPT-IMPROVEMENTS-2026-01-14.md +356 -0
  40. package/docs/research/SESSION-NOTES-2026-01-11-RECOGNITION-EVAL.md +419 -0
  41. package/docs/research/apa.csl +2133 -0
  42. package/docs/research/archive/PAPER-DRAFT-RECOGNITION-TUTORING.md +1637 -0
  43. package/docs/research/archive/paper-multiagent-tutor.tex +978 -0
  44. package/docs/research/paper-draft/full-paper.md +136 -0
  45. package/docs/research/paper-draft/images/pasted-image-2026-01-24T03-47-47-846Z-d76a7ae2.png +0 -0
  46. package/docs/research/paper-draft/references.bib +515 -0
  47. package/docs/research/transcript-baseline.md +139 -0
  48. package/docs/research/transcript-recognition-multiagent.md +187 -0
  49. package/hooks/useEvalData.ts +625 -0
  50. package/index.js +27 -0
  51. package/package.json +73 -0
  52. package/routes/evalRoutes.js +3002 -0
  53. package/scripts/advanced-eval-analysis.js +351 -0
  54. package/scripts/analyze-eval-costs.js +378 -0
  55. package/scripts/analyze-eval-results.js +513 -0
  56. package/scripts/analyze-interaction-evals.js +368 -0
  57. package/server-init.js +45 -0
  58. package/server.js +162 -0
  59. package/services/benchmarkService.js +1892 -0
  60. package/services/evaluationRunner.js +739 -0
  61. package/services/evaluationStore.js +1121 -0
  62. package/services/learnerConfigLoader.js +385 -0
  63. package/services/learnerTutorInteractionEngine.js +857 -0
  64. package/services/memory/learnerMemoryService.js +1227 -0
  65. package/services/memory/learnerWritingPad.js +577 -0
  66. package/services/memory/tutorWritingPad.js +674 -0
  67. package/services/promptRecommendationService.js +493 -0
  68. package/services/rubricEvaluator.js +826 -0
@@ -0,0 +1,261 @@
1
+ /**
2
+ * PsychodynamicQuadrant Component
3
+ *
4
+ * 2D scatter visualization of psychodynamic parameters:
5
+ * - X-axis: superegoCompliance (0.0-1.0)
6
+ * - Y-axis: recognitionSeeking (0.0-1.0)
7
+ *
8
+ * Four quadrants represent different tutor-learner dynamics:
9
+ * - Top-right (high/high): Dialogical Recognition (ideal)
10
+ * - Top-left (low/high): Permissive Responsive
11
+ * - Bottom-right (high/low): Traditional Authoritarian
12
+ * - Bottom-left (low/low): Disengaged
13
+ */
14
+
15
+ import React from 'react';
16
+
17
+ interface HistoricalPoint {
18
+ compliance: number;
19
+ seeking: number;
20
+ timestamp: string;
21
+ }
22
+
23
+ interface PsychodynamicQuadrantProps {
24
+ superegoCompliance: number;
25
+ recognitionSeeking: number;
26
+ historicalPoints?: HistoricalPoint[];
27
+ size?: number;
28
+ }
29
+
30
+ export const PsychodynamicQuadrant: React.FC<PsychodynamicQuadrantProps> = ({
31
+ superegoCompliance,
32
+ recognitionSeeking,
33
+ historicalPoints = [],
34
+ size = 200,
35
+ }) => {
36
+ const padding = 40;
37
+ const chartSize = size - padding * 2;
38
+
39
+ // Convert values (0-1) to chart coordinates
40
+ const toX = (value: number) => padding + value * chartSize;
41
+ const toY = (value: number) => padding + (1 - value) * chartSize; // Invert Y
42
+
43
+ // Current position
44
+ const currentX = toX(superegoCompliance);
45
+ const currentY = toY(recognitionSeeking);
46
+
47
+ // Quadrant labels and positions
48
+ const quadrants = [
49
+ {
50
+ label: 'Permissive',
51
+ sublabel: 'Responsive',
52
+ x: padding + chartSize * 0.25,
53
+ y: padding + chartSize * 0.25,
54
+ color: 'text-blue-400/60',
55
+ },
56
+ {
57
+ label: 'Dialogical',
58
+ sublabel: 'Recognition',
59
+ x: padding + chartSize * 0.75,
60
+ y: padding + chartSize * 0.25,
61
+ color: 'text-green-400/60',
62
+ },
63
+ {
64
+ label: 'Disengaged',
65
+ sublabel: '',
66
+ x: padding + chartSize * 0.25,
67
+ y: padding + chartSize * 0.75,
68
+ color: 'text-gray-500/60',
69
+ },
70
+ {
71
+ label: 'Traditional',
72
+ sublabel: 'Authoritarian',
73
+ x: padding + chartSize * 0.75,
74
+ y: padding + chartSize * 0.75,
75
+ color: 'text-red-400/60',
76
+ },
77
+ ];
78
+
79
+ // Determine current quadrant for highlight
80
+ const getQuadrantName = () => {
81
+ if (superegoCompliance >= 0.5 && recognitionSeeking >= 0.5) return 'Dialogical Recognition';
82
+ if (superegoCompliance < 0.5 && recognitionSeeking >= 0.5) return 'Permissive Responsive';
83
+ if (superegoCompliance >= 0.5 && recognitionSeeking < 0.5) return 'Traditional Authoritarian';
84
+ return 'Disengaged';
85
+ };
86
+
87
+ return (
88
+ <div className="bg-gray-900/60 backdrop-blur-sm border border-white/5 rounded-xl p-4">
89
+ <div className="text-xs text-gray-400 mb-3">Psychodynamic Quadrant</div>
90
+
91
+ <svg width={size} height={size} className="mx-auto">
92
+ {/* Background gradient for quadrants */}
93
+ <defs>
94
+ <linearGradient id="quadrantBg" x1="0%" y1="0%" x2="100%" y2="100%">
95
+ <stop offset="0%" stopColor="#3b82f6" stopOpacity="0.1" />
96
+ <stop offset="50%" stopColor="#22c55e" stopOpacity="0.15" />
97
+ <stop offset="100%" stopColor="#ef4444" stopOpacity="0.1" />
98
+ </linearGradient>
99
+ <radialGradient id="pointGlow">
100
+ <stop offset="0%" stopColor="#E63946" stopOpacity="0.8" />
101
+ <stop offset="100%" stopColor="#E63946" stopOpacity="0" />
102
+ </radialGradient>
103
+ </defs>
104
+
105
+ {/* Chart background */}
106
+ <rect
107
+ x={padding}
108
+ y={padding}
109
+ width={chartSize}
110
+ height={chartSize}
111
+ fill="url(#quadrantBg)"
112
+ rx="4"
113
+ />
114
+
115
+ {/* Grid lines */}
116
+ <line
117
+ x1={padding + chartSize / 2}
118
+ y1={padding}
119
+ x2={padding + chartSize / 2}
120
+ y2={padding + chartSize}
121
+ stroke="white"
122
+ strokeOpacity="0.1"
123
+ strokeDasharray="4,4"
124
+ />
125
+ <line
126
+ x1={padding}
127
+ y1={padding + chartSize / 2}
128
+ x2={padding + chartSize}
129
+ y2={padding + chartSize / 2}
130
+ stroke="white"
131
+ strokeOpacity="0.1"
132
+ strokeDasharray="4,4"
133
+ />
134
+
135
+ {/* Quadrant labels */}
136
+ {quadrants.map((q, i) => (
137
+ <g key={i}>
138
+ <text
139
+ x={q.x}
140
+ y={q.y - 6}
141
+ textAnchor="middle"
142
+ className={`text-[9px] ${q.color} fill-current`}
143
+ >
144
+ {q.label}
145
+ </text>
146
+ {q.sublabel && (
147
+ <text
148
+ x={q.x}
149
+ y={q.y + 6}
150
+ textAnchor="middle"
151
+ className={`text-[9px] ${q.color} fill-current`}
152
+ >
153
+ {q.sublabel}
154
+ </text>
155
+ )}
156
+ </g>
157
+ ))}
158
+
159
+ {/* Historical trail */}
160
+ {historicalPoints.length > 1 && (
161
+ <polyline
162
+ points={historicalPoints
163
+ .map((p) => `${toX(p.compliance)},${toY(p.seeking)}`)
164
+ .join(' ')}
165
+ fill="none"
166
+ stroke="#E63946"
167
+ strokeOpacity="0.3"
168
+ strokeWidth="1"
169
+ />
170
+ )}
171
+
172
+ {/* Historical points (fading) */}
173
+ {historicalPoints.map((point, i) => {
174
+ const opacity = 0.2 + (i / historicalPoints.length) * 0.4;
175
+ return (
176
+ <circle
177
+ key={i}
178
+ cx={toX(point.compliance)}
179
+ cy={toY(point.seeking)}
180
+ r={3}
181
+ fill="#E63946"
182
+ fillOpacity={opacity}
183
+ />
184
+ );
185
+ })}
186
+
187
+ {/* Current position glow */}
188
+ <circle cx={currentX} cy={currentY} r={20} fill="url(#pointGlow)" />
189
+
190
+ {/* Current position */}
191
+ <circle
192
+ cx={currentX}
193
+ cy={currentY}
194
+ r={8}
195
+ fill="#E63946"
196
+ stroke="white"
197
+ strokeWidth="2"
198
+ />
199
+
200
+ {/* Axis labels */}
201
+ <text
202
+ x={padding + chartSize / 2}
203
+ y={size - 8}
204
+ textAnchor="middle"
205
+ className="text-[10px] text-gray-500 fill-current"
206
+ >
207
+ Superego Compliance
208
+ </text>
209
+ <text
210
+ x={12}
211
+ y={padding + chartSize / 2}
212
+ textAnchor="middle"
213
+ className="text-[10px] text-gray-500 fill-current"
214
+ transform={`rotate(-90, 12, ${padding + chartSize / 2})`}
215
+ >
216
+ Recognition Seeking
217
+ </text>
218
+
219
+ {/* Axis scale markers */}
220
+ <text
221
+ x={padding}
222
+ y={size - 8}
223
+ textAnchor="middle"
224
+ className="text-[8px] text-gray-600 fill-current"
225
+ >
226
+ 0
227
+ </text>
228
+ <text
229
+ x={padding + chartSize}
230
+ y={size - 8}
231
+ textAnchor="middle"
232
+ className="text-[8px] text-gray-600 fill-current"
233
+ >
234
+ 1
235
+ </text>
236
+ </svg>
237
+
238
+ {/* Current values and quadrant */}
239
+ <div className="mt-3 pt-3 border-t border-white/5 space-y-2">
240
+ <div className="flex justify-between text-xs">
241
+ <span className="text-gray-500">Compliance</span>
242
+ <span className="text-white font-medium">
243
+ {(superegoCompliance * 100).toFixed(0)}%
244
+ </span>
245
+ </div>
246
+ <div className="flex justify-between text-xs">
247
+ <span className="text-gray-500">Recognition</span>
248
+ <span className="text-white font-medium">
249
+ {(recognitionSeeking * 100).toFixed(0)}%
250
+ </span>
251
+ </div>
252
+ <div className="flex justify-between text-xs pt-2 border-t border-white/5">
253
+ <span className="text-gray-500">Quadrant</span>
254
+ <span className="text-[#E63946] font-medium">{getQuadrantName()}</span>
255
+ </div>
256
+ </div>
257
+ </div>
258
+ );
259
+ };
260
+
261
+ export default PsychodynamicQuadrant;