@openclawcity/become 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.
- package/LICENSE +21 -0
- package/README.md +133 -0
- package/dist/cli.cjs +113 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +89 -0
- package/dist/cli.js.map +1 -0
- package/dist/dashboard.cjs +806 -0
- package/dist/dashboard.cjs.map +1 -0
- package/dist/dashboard.d.cts +92 -0
- package/dist/dashboard.d.ts +92 -0
- package/dist/dashboard.js +767 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/index.cjs +2760 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +670 -0
- package/dist/index.d.ts +670 -0
- package/dist/index.js +2696 -0
- package/dist/index.js.map +1 -0
- package/dist/types-DzOc15AL.d.cts +273 -0
- package/dist/types-DzOc15AL.d.ts +273 -0
- package/migrations/001_initial.sql +128 -0
- package/package.json +85 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dashboard/theme.ts","../src/dashboard/components/SkillRing.tsx","../src/dashboard/components/Sparkline.tsx","../src/core/validation.ts","../src/core/milestones.ts","../src/dashboard/components/MilestoneTimeline.tsx","../src/dashboard/components/GrowthCard.tsx","../src/dashboard/components/PeerGraph.tsx","../src/dashboard/components/PopulationView.tsx"],"sourcesContent":["import type { CelebrationTier, DreyfusStage } from '../core/types.js';\n\nexport const STAGE_COLORS: Record<DreyfusStage, string> = {\n novice: '#64748b',\n beginner: '#22d3ee',\n competent: '#34d399',\n proficient: '#a78bfa',\n expert: '#fbbf24',\n};\n\nexport const STAGE_LABELS: Record<DreyfusStage, string> = {\n novice: 'Novice',\n beginner: 'Beginner',\n competent: 'Competent',\n proficient: 'Proficient',\n expert: 'Expert',\n};\n\nexport const BACKGROUND = {\n panel: 'rgba(10, 12, 20, 0.94)',\n card: 'rgba(255, 255, 255, 0.03)',\n hover: 'rgba(255, 255, 255, 0.06)',\n};\n\nexport const BORDER = {\n subtle: 'rgba(0, 212, 255, 0.15)',\n accent: 'rgba(0, 212, 255, 0.3)',\n};\n\nexport const ACCENT = '#00d4ff';\nexport const GOLD = 'rgba(255, 215, 0, 0.8)';\n\nexport const CELEBRATION_CONFIG: Record<CelebrationTier, { particles: number; spread: number; duration: number }> = {\n micro: { particles: 0, spread: 0, duration: 0 },\n small: { particles: 20, spread: 50, duration: 1000 },\n medium: { particles: 60, spread: 70, duration: 1500 },\n large: { particles: 80, spread: 90, duration: 2000 },\n epic: { particles: 120, spread: 120, duration: 4000 },\n};\n","import React from 'react';\nimport type { DreyfusStage } from '../../core/types.js';\nimport { STAGE_COLORS, STAGE_LABELS } from '../theme.js';\n\nexport interface SkillRingProps {\n skill: string;\n score: number;\n stage: DreyfusStage;\n size?: number;\n showLabel?: boolean;\n className?: string;\n}\n\nexport function SkillRing({\n skill,\n score,\n stage,\n size = 80,\n showLabel = true,\n className,\n}: SkillRingProps) {\n const safeSize = Math.max(24, size); // Minimum 24px to avoid negative radius\n const strokeWidth = Math.max(4, safeSize * 0.08);\n const radius = (safeSize - strokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n const progress = Math.min(100, Math.max(0, score)) / 100;\n const offset = circumference * (1 - progress);\n const color = STAGE_COLORS[stage];\n const center = safeSize / 2;\n\n return (\n <div\n className={className}\n style={{\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 4,\n }}\n >\n <svg\n width={safeSize}\n height={safeSize}\n viewBox={`0 0 ${safeSize} ${safeSize}`}\n role=\"img\"\n aria-label={`${skill}: ${score}/100, ${STAGE_LABELS[stage]}`}\n >\n {/* Background track */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n stroke=\"rgba(255,255,255,0.08)\"\n strokeWidth={strokeWidth}\n />\n {/* Progress arc */}\n <circle\n cx={center}\n cy={center}\n r={radius}\n fill=\"none\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n strokeLinecap=\"round\"\n transform={`rotate(-90 ${center} ${center})`}\n style={{ transition: 'stroke-dashoffset 0.6s ease' }}\n />\n {/* Score text */}\n <text\n x={center}\n y={center}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fill=\"white\"\n fontSize={safeSize * 0.28}\n fontWeight=\"bold\"\n fontFamily=\"system-ui, sans-serif\"\n >\n {score}\n </text>\n </svg>\n {showLabel && (\n <div style={{ textAlign: 'center' }}>\n <div\n style={{\n color: 'rgba(255,255,255,0.9)',\n fontSize: Math.max(10, safeSize * 0.14),\n fontWeight: 500,\n fontFamily: 'system-ui, sans-serif',\n }}\n >\n {skill}\n </div>\n <div\n style={{\n color,\n fontSize: Math.max(9, safeSize * 0.12),\n fontFamily: 'system-ui, sans-serif',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n }}\n >\n {STAGE_LABELS[stage]}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import React, { useId } from 'react';\nimport type { DreyfusStage } from '../../core/types.js';\nimport { STAGE_COLORS } from '../theme.js';\n\nexport interface SparklinePoint {\n score: number;\n timestamp: string;\n}\n\nexport interface SparklineProps {\n data: SparklinePoint[];\n width?: number;\n height?: number;\n color?: DreyfusStage | string;\n showDots?: boolean;\n className?: string;\n}\n\nexport function Sparkline({\n data,\n width = 300,\n height = 40,\n color = '#22d3ee',\n showDots = false,\n className,\n}: SparklineProps) {\n if (data.length < 2) {\n return (\n <svg width={width} height={height} className={className} role=\"img\" aria-label=\"Insufficient data\">\n <text x={width / 2} y={height / 2} textAnchor=\"middle\" dominantBaseline=\"central\" fill=\"rgba(255,255,255,0.3)\" fontSize={10}>\n Not enough data\n </text>\n </svg>\n );\n }\n\n // Resolve color — use hasOwnProperty to avoid prototype key collisions\n const strokeColor = Object.prototype.hasOwnProperty.call(STAGE_COLORS, color)\n ? STAGE_COLORS[color as DreyfusStage]\n : color;\n\n // Compute points\n const padding = 4;\n const chartWidth = width - padding * 2;\n const chartHeight = height - padding * 2;\n\n const scores = data.map((d) => d.score);\n let minScore = scores[0];\n let maxScore = scores[0];\n for (let i = 1; i < scores.length; i++) {\n if (scores[i] < minScore) minScore = scores[i];\n if (scores[i] > maxScore) maxScore = scores[i];\n }\n const range = maxScore - minScore || 1;\n\n const points = data.map((d, i) => {\n const x = padding + (i / (data.length - 1)) * chartWidth;\n const y = padding + chartHeight - ((d.score - minScore) / range) * chartHeight;\n return { x, y };\n });\n\n const polyline = points.map((p) => `${p.x},${p.y}`).join(' ');\n\n // Gradient fill under the line\n const fillPoints = [\n ...points.map((p) => `${p.x},${p.y}`),\n `${points[points.length - 1].x},${height - padding}`,\n `${points[0].x},${height - padding}`,\n ].join(' ');\n\n const reactId = useId();\n const gradientId = `sparkline-grad-${reactId.replace(/:/g, '')}`;\n\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n className={className}\n role=\"img\"\n aria-label={`Trend: ${scores[0]} to ${scores[scores.length - 1]}`}\n >\n <defs>\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor={strokeColor} stopOpacity=\"0.2\" />\n <stop offset=\"100%\" stopColor={strokeColor} stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n {/* Fill area */}\n <polygon points={fillPoints} fill={`url(#${gradientId})`} />\n {/* Line */}\n <polyline\n points={polyline}\n fill=\"none\"\n stroke={strokeColor}\n strokeWidth={1.5}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n />\n {/* Dots */}\n {showDots &&\n points.map((p, i) => (\n <circle\n key={i}\n cx={p.x}\n cy={p.y}\n r={2}\n fill={strokeColor}\n />\n ))}\n {/* End dot (always shown) */}\n <circle\n cx={points[points.length - 1].x}\n cy={points[points.length - 1].y}\n r={2.5}\n fill={strokeColor}\n />\n </svg>\n );\n}\n","const MAX_AGENT_ID_LENGTH = 200;\nconst AGENT_ID_REGEX = /^[a-zA-Z0-9_.:@/-]+$/;\n\nexport function validateAgentId(agentId: string): void {\n if (!agentId || typeof agentId !== 'string') {\n throw new Error('agentId is required and must be a non-empty string');\n }\n if (agentId.length > MAX_AGENT_ID_LENGTH) {\n throw new Error(`agentId too long (max ${MAX_AGENT_ID_LENGTH} chars)`);\n }\n if (!AGENT_ID_REGEX.test(agentId)) {\n throw new Error('agentId contains invalid characters (allowed: alphanumeric, _ . : @ / -)');\n }\n}\n","import type { CelebrationTier, Milestone, MilestoneConfig, Score, StorageAdapter } from './types.js';\nimport { validateAgentId } from './validation.js';\n\nconst BUILT_IN: Record<string, MilestoneConfig> = {\n skill_discovered: { threshold: 1, description: 'First score for a skill' },\n skill_competent: { threshold: 36, description: 'Reached competent stage' },\n skill_proficient: { threshold: 56, description: 'Reached proficient stage' },\n skill_expert: { threshold: 76, description: 'Reached expert stage' },\n first_artifact: { threshold: 1, description: 'Created first output' },\n ten_artifacts: { threshold: 10, description: 'Created 10 outputs' },\n first_collab: { threshold: 1, description: 'Completed first collaboration' },\n first_teaching: { threshold: 1, description: 'Taught another agent for the first time' },\n first_peer_review: { threshold: 1, description: 'Gave first peer review' },\n identity_shift: { threshold: 1, description: 'Agent evolved its identity' },\n norm_setter: { threshold: 1, description: 'Started a cultural norm adopted by 3+ agents' },\n};\n\nexport class MilestoneDetector {\n private custom: Record<string, MilestoneConfig> = {};\n\n constructor(private adapter: StorageAdapter) {}\n\n register(type: string, config: MilestoneConfig): void {\n this.custom[type] = config;\n }\n\n async check(agentId: string, scores: Score[]): Promise<Milestone[]> {\n validateAgentId(agentId);\n const awarded: Milestone[] = [];\n const now = new Date().toISOString();\n\n // Track global milestones already checked this call to avoid redundant adapter calls\n const globalChecked = new Set<string>();\n\n for (const score of scores) {\n // Skill discovery (per-skill)\n if (score.score > 0) {\n const type = `skill_discovered:${score.skill}`;\n if (await this.tryAward(agentId, type, 1, score.skill, now)) {\n awarded.push({ agent_id: agentId, milestone_type: type, threshold: 1, skill: score.skill, achieved_at: now });\n }\n }\n\n // Stage transitions (per-skill)\n const stageChecks: [string, number][] = [\n ['skill_competent', 36],\n ['skill_proficient', 56],\n ['skill_expert', 76],\n ];\n\n for (const [prefix, threshold] of stageChecks) {\n if (score.score >= threshold) {\n const type = `${prefix}:${score.skill}`;\n if (await this.tryAward(agentId, type, threshold, score.skill, now)) {\n awarded.push({ agent_id: agentId, milestone_type: type, threshold, skill: score.skill, achieved_at: now });\n }\n }\n }\n\n // Global milestones — only check once across all scores\n const globalMilestones: [string, number, boolean][] = [\n ['first_artifact', 1, score.evidence.artifact_count >= 1],\n ['ten_artifacts', 10, score.evidence.artifact_count >= 10],\n ['first_collab', 1, score.evidence.collab_count >= 1],\n ['first_teaching', 1, score.evidence.teaching_events >= 1],\n ['first_peer_review', 1, score.evidence.peer_reviews_given >= 1],\n ];\n\n for (const [type, threshold, eligible] of globalMilestones) {\n if (eligible && !globalChecked.has(type)) {\n globalChecked.add(type);\n if (await this.tryAward(agentId, type, threshold, undefined, now)) {\n awarded.push({ agent_id: agentId, milestone_type: type, threshold, achieved_at: now });\n }\n }\n }\n }\n\n return awarded;\n }\n\n private async tryAward(\n agentId: string,\n milestoneType: string,\n threshold: number,\n skill: string | undefined,\n now: string,\n ): Promise<boolean> {\n const exists = await this.adapter.hasMilestone(agentId, milestoneType, skill);\n if (exists) return false;\n return this.adapter.saveMilestone({\n agent_id: agentId,\n milestone_type: milestoneType,\n threshold,\n skill,\n achieved_at: now,\n });\n }\n\n static celebrationTier(milestoneType: string, threshold?: number): CelebrationTier {\n if (milestoneType.startsWith('skill_expert')) return 'epic';\n if (milestoneType.startsWith('skill_proficient')) return 'large';\n if (milestoneType.startsWith('skill_competent')) return 'medium';\n if (milestoneType.startsWith('skill_discovered')) return 'small';\n if (threshold !== undefined) {\n if (threshold >= 50) return 'large';\n if (threshold >= 10) return 'medium';\n }\n return 'small';\n }\n\n static getBuiltInMilestones(): Record<string, MilestoneConfig> {\n return { ...BUILT_IN };\n }\n}\n","import React from 'react';\nimport type { CelebrationTier, Milestone } from '../../core/types.js';\nimport { MilestoneDetector } from '../../core/milestones.js';\nimport { STAGE_COLORS, GOLD } from '../theme.js';\n\nexport interface MilestoneTimelineProps {\n milestones: Milestone[];\n limit?: number;\n className?: string;\n}\n\nfunction formatMilestoneLabel(type: string): string {\n // \"skill_expert:debugging\" → \"Expert: debugging\"\n // \"first_artifact\" → \"First Artifact\"\n if (type.includes(':')) {\n const [prefix, skill] = type.split(':');\n const stage = prefix.replace('skill_', '');\n return `${stage.charAt(0).toUpperCase() + stage.slice(1)}: ${skill}`;\n }\n return type\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction tierColor(tier: CelebrationTier): string {\n switch (tier) {\n case 'epic': return GOLD;\n case 'large': return STAGE_COLORS.proficient;\n case 'medium': return STAGE_COLORS.competent;\n case 'small': return STAGE_COLORS.beginner;\n default: return 'rgba(255,255,255,0.3)';\n }\n}\n\nfunction formatDate(iso: string): string {\n try {\n const d = new Date(iso);\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n } catch {\n return '';\n }\n}\n\nexport function MilestoneTimeline({\n milestones,\n limit = 10,\n className,\n}: MilestoneTimelineProps) {\n const sorted = [...milestones]\n .sort((a, b) => b.achieved_at.localeCompare(a.achieved_at))\n .slice(0, limit);\n\n if (sorted.length === 0) {\n return (\n <div className={className} style={{ color: 'rgba(255,255,255,0.4)', fontSize: 13, fontFamily: 'system-ui, sans-serif', padding: 16 }}>\n No milestones yet\n </div>\n );\n }\n\n return (\n <div className={className} style={{ position: 'relative', paddingLeft: 20 }} role=\"list\" aria-label=\"Milestone timeline\">\n {/* Vertical line */}\n <div\n style={{\n position: 'absolute',\n left: 7,\n top: 4,\n bottom: 4,\n width: 2,\n background: 'rgba(255,255,255,0.1)',\n borderRadius: 1,\n }}\n />\n {sorted.map((m, i) => {\n const tier = MilestoneDetector.celebrationTier(m.milestone_type, m.threshold);\n const color = tierColor(tier);\n return (\n <div\n key={`${m.milestone_type}-${m.achieved_at}-${i}`}\n role=\"listitem\"\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 10,\n marginBottom: 12,\n position: 'relative',\n }}\n >\n {/* Dot */}\n <div\n style={{\n position: 'absolute',\n left: -16,\n top: 4,\n width: 10,\n height: 10,\n borderRadius: '50%',\n background: color,\n border: `2px solid ${color}`,\n boxShadow: tier === 'epic' ? `0 0 8px ${color}` : undefined,\n }}\n />\n <div style={{ flex: 1 }}>\n <div\n style={{\n color: 'rgba(255,255,255,0.9)',\n fontSize: 13,\n fontWeight: 500,\n fontFamily: 'system-ui, sans-serif',\n }}\n >\n {formatMilestoneLabel(m.milestone_type)}\n </div>\n <div\n style={{\n color: 'rgba(255,255,255,0.4)',\n fontSize: 11,\n fontFamily: 'system-ui, sans-serif',\n marginTop: 2,\n }}\n >\n {formatDate(m.achieved_at)}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import React from 'react';\nimport type { Milestone, Score } from '../../core/types.js';\nimport { BACKGROUND, BORDER } from '../theme.js';\nimport { SkillRing } from './SkillRing.js';\nimport { Sparkline } from './Sparkline.js';\nimport { MilestoneTimeline } from './MilestoneTimeline.js';\n\nexport interface GrowthCardProps {\n agentId: string;\n agentName?: string;\n scores: Score[];\n scoreHistory?: Map<string, { score: number; timestamp: string }[]>;\n milestones?: Milestone[];\n className?: string;\n}\n\nexport function GrowthCard({\n agentId,\n agentName,\n scores,\n scoreHistory,\n milestones,\n className,\n}: GrowthCardProps) {\n const sortedScores = [...scores].sort((a, b) => b.score - a.score);\n const avgScore = scores.length > 0\n ? Math.round(scores.reduce((sum, s) => sum + s.score, 0) / scores.length)\n : 0;\n\n return (\n <div\n className={className}\n style={{\n background: BACKGROUND.panel,\n border: `1px solid ${BORDER.subtle}`,\n borderRadius: 12,\n padding: 20,\n fontFamily: 'system-ui, sans-serif',\n color: 'white',\n maxWidth: 380,\n backdropFilter: 'blur(20px) saturate(1.5)',\n }}\n >\n {/* Header */}\n <div style={{ marginBottom: 16 }}>\n <div style={{ fontSize: 16, fontWeight: 600, color: 'rgba(255,255,255,0.95)' }}>\n {agentName ?? agentId}\n </div>\n <div style={{ fontSize: 12, color: 'rgba(255,255,255,0.4)', marginTop: 2 }}>\n {scores.length} skill{scores.length !== 1 ? 's' : ''} · avg score {avgScore}\n </div>\n </div>\n\n {/* Skill rings */}\n {sortedScores.length > 0 && (\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: 16,\n justifyContent: 'center',\n marginBottom: 20,\n padding: '12px 0',\n borderTop: `1px solid ${BORDER.subtle}`,\n borderBottom: `1px solid ${BORDER.subtle}`,\n }}\n >\n {sortedScores.slice(0, 5).map((s) => (\n <SkillRing\n key={s.skill}\n skill={s.skill}\n score={s.score}\n stage={s.dreyfus_stage}\n size={64}\n />\n ))}\n </div>\n )}\n\n {/* Sparklines for top skills */}\n {scoreHistory && sortedScores.length > 0 && (\n <div style={{ marginBottom: 16 }}>\n {sortedScores.slice(0, 3).map((s) => {\n const history = scoreHistory.get(s.skill);\n if (!history || history.length < 2) return null;\n return (\n <div key={s.skill} style={{ marginBottom: 8 }}>\n <div style={{ fontSize: 11, color: 'rgba(255,255,255,0.5)', marginBottom: 2 }}>\n {s.skill}\n </div>\n <Sparkline\n data={history}\n width={340}\n height={32}\n color={s.dreyfus_stage}\n />\n </div>\n );\n })}\n </div>\n )}\n\n {/* Milestones */}\n {milestones && milestones.length > 0 && (\n <div>\n <div style={{ fontSize: 12, color: 'rgba(255,255,255,0.5)', marginBottom: 8, fontWeight: 500 }}>\n Recent Milestones\n </div>\n <MilestoneTimeline milestones={milestones} limit={5} />\n </div>\n )}\n\n {/* Empty state */}\n {scores.length === 0 && (\n <div style={{ textAlign: 'center', padding: 24, color: 'rgba(255,255,255,0.3)', fontSize: 13 }}>\n No skills scored yet\n </div>\n )}\n </div>\n );\n}\n","import React, { useMemo } from 'react';\nimport type { LearningEdge } from '../../core/types.js';\nimport { ACCENT, STAGE_COLORS } from '../theme.js';\n\nexport interface PeerGraphNode {\n id: string;\n label?: string;\n stage?: keyof typeof STAGE_COLORS;\n}\n\nexport interface PeerGraphProps {\n nodes: PeerGraphNode[];\n edges: LearningEdge[];\n width?: number;\n height?: number;\n className?: string;\n}\n\ninterface LayoutNode extends PeerGraphNode {\n x: number;\n y: number;\n}\n\nexport function PeerGraph({\n nodes,\n edges,\n width = 400,\n height = 300,\n className,\n}: PeerGraphProps) {\n // Layout nodes in a circle\n const layout = useMemo((): LayoutNode[] => {\n const cx = width / 2;\n const cy = height / 2;\n const radius = Math.min(cx, cy) - 40;\n\n return nodes.map((node, i) => {\n const angle = (2 * Math.PI * i) / nodes.length - Math.PI / 2;\n return {\n ...node,\n x: cx + radius * Math.cos(angle),\n y: cy + radius * Math.sin(angle),\n };\n });\n }, [nodes, width, height]);\n\n const nodeMap = useMemo(() => {\n const map = new Map<string, LayoutNode>();\n for (const n of layout) map.set(n.id, n);\n return map;\n }, [layout]);\n\n // Pre-compute deduplicated edges and per-node edge counts\n const { edgeCounts, dedupedEdges, nodeEdgeCounts } = useMemo(() => {\n const counts = new Map<string, number>();\n const deduped: { key: string; edge: (typeof edges)[0]; count: number }[] = [];\n const seen = new Set<string>();\n const nodeCounts = new Map<string, number>();\n\n for (const e of edges) {\n const key = [e.from_agent, e.to_agent].sort().join('\\u2194');\n counts.set(key, (counts.get(key) ?? 0) + 1);\n nodeCounts.set(e.from_agent, (nodeCounts.get(e.from_agent) ?? 0) + 1);\n nodeCounts.set(e.to_agent, (nodeCounts.get(e.to_agent) ?? 0) + 1);\n }\n\n for (const e of edges) {\n const key = [e.from_agent, e.to_agent].sort().join('\\u2194');\n if (!seen.has(key)) {\n seen.add(key);\n deduped.push({ key, edge: e, count: counts.get(key) ?? 1 });\n }\n }\n\n return { edgeCounts: counts, dedupedEdges: deduped, nodeEdgeCounts: nodeCounts };\n }, [edges]);\n\n if (nodes.length === 0) {\n return (\n <svg width={width} height={height} className={className}>\n <text x={width / 2} y={height / 2} textAnchor=\"middle\" fill=\"rgba(255,255,255,0.3)\" fontSize={13}>\n No agents to display\n </text>\n </svg>\n );\n }\n\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n className={className}\n role=\"img\"\n aria-label={`Learning network: ${nodes.length} agents, ${edges.length} connections`}\n >\n {/* Edges (pre-deduplicated) */}\n {dedupedEdges.map(({ key, edge, count }) => {\n const from = nodeMap.get(edge.from_agent);\n const to = nodeMap.get(edge.to_agent);\n if (!from || !to) return null;\n\n const strokeWidth = Math.min(4, 0.5 + count * 0.5);\n\n return (\n <line\n key={`edge-${key}`}\n x1={from.x}\n y1={from.y}\n x2={to.x}\n y2={to.y}\n stroke={ACCENT}\n strokeWidth={strokeWidth}\n strokeOpacity={0.3 + Math.min(0.4, count * 0.1)}\n />\n );\n })}\n\n {/* Nodes (edge counts pre-computed) */}\n {layout.map((node) => {\n const color = node.stage ? STAGE_COLORS[node.stage] : ACCENT;\n const edgeCount = nodeEdgeCounts.get(node.id) ?? 0;\n const radius = Math.min(20, 8 + edgeCount * 1.5);\n\n return (\n <g key={node.id}>\n {/* Glow */}\n <circle cx={node.x} cy={node.y} r={radius + 4} fill={color} opacity={0.1} />\n {/* Node */}\n <circle cx={node.x} cy={node.y} r={radius} fill={color} opacity={0.8} />\n {/* Label */}\n <text\n x={node.x}\n y={node.y + radius + 14}\n textAnchor=\"middle\"\n fill=\"rgba(255,255,255,0.7)\"\n fontSize={10}\n fontFamily=\"system-ui, sans-serif\"\n >\n {node.label ?? node.id}\n </text>\n </g>\n );\n })}\n </svg>\n );\n}\n","import React, { useMemo } from 'react';\nimport type { DreyfusStage, Score } from '../../core/types.js';\nimport { BACKGROUND, BORDER, STAGE_COLORS, STAGE_LABELS } from '../theme.js';\n\nexport interface PopulationAgent {\n agent_id: string;\n agent_name?: string;\n scores: Score[];\n}\n\nexport interface PopulationViewProps {\n agents: PopulationAgent[];\n className?: string;\n}\n\nexport function PopulationView({ agents, className }: PopulationViewProps) {\n const { allScores, avgScore, stageDist, totalSkills, topSkills } = useMemo(() => {\n const scores = agents.flatMap((a) => a.scores);\n const avg = scores.length > 0\n ? Math.round(scores.reduce((s, sc) => s + sc.score, 0) / scores.length)\n : 0;\n\n const dist: Record<DreyfusStage, number> = {\n novice: 0, beginner: 0, competent: 0, proficient: 0, expert: 0,\n };\n for (const s of scores) {\n dist[s.dreyfus_stage]++;\n }\n\n const skillCounts = new Map<string, number>();\n for (const s of scores) {\n skillCounts.set(s.skill, (skillCounts.get(s.skill) ?? 0) + 1);\n }\n const top = [...skillCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 8);\n\n return { allScores: scores, avgScore: avg, stageDist: dist, totalSkills: scores.length, topSkills: top };\n }, [agents]);\n\n return (\n <div\n className={className}\n style={{\n background: BACKGROUND.panel,\n border: `1px solid ${BORDER.subtle}`,\n borderRadius: 12,\n padding: 20,\n fontFamily: 'system-ui, sans-serif',\n color: 'white',\n maxWidth: 500,\n backdropFilter: 'blur(20px) saturate(1.5)',\n }}\n >\n {/* Header */}\n <div style={{ fontSize: 16, fontWeight: 600, marginBottom: 16 }}>\n Population Overview\n </div>\n\n {/* Summary stats */}\n <div style={{ display: 'flex', gap: 24, marginBottom: 20 }}>\n <Stat label=\"Agents\" value={agents.length} />\n <Stat label=\"Skills tracked\" value={totalSkills} />\n <Stat label=\"Avg score\" value={avgScore} />\n </div>\n\n {/* Stage distribution bar */}\n <div style={{ marginBottom: 20 }}>\n <div style={{ fontSize: 12, color: 'rgba(255,255,255,0.5)', marginBottom: 8 }}>\n Stage Distribution\n </div>\n {totalSkills > 0 ? (\n <>\n <div style={{ display: 'flex', height: 20, borderRadius: 4, overflow: 'hidden' }}>\n {(Object.entries(stageDist) as [DreyfusStage, number][])\n .filter(([, count]) => count > 0)\n .map(([stage, count]) => (\n <div\n key={stage}\n style={{\n width: `${(count / totalSkills) * 100}%`,\n background: STAGE_COLORS[stage],\n minWidth: 2,\n }}\n title={`${STAGE_LABELS[stage]}: ${count}`}\n />\n ))}\n </div>\n <div style={{ display: 'flex', gap: 12, marginTop: 6, flexWrap: 'wrap' }}>\n {(Object.entries(stageDist) as [DreyfusStage, number][])\n .filter(([, count]) => count > 0)\n .map(([stage, count]) => (\n <div key={stage} style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n <div style={{ width: 8, height: 8, borderRadius: 2, background: STAGE_COLORS[stage] }} />\n <span style={{ fontSize: 11, color: 'rgba(255,255,255,0.6)' }}>\n {STAGE_LABELS[stage]} ({count})\n </span>\n </div>\n ))}\n </div>\n </>\n ) : (\n <div style={{ color: 'rgba(255,255,255,0.3)', fontSize: 12 }}>No data</div>\n )}\n </div>\n\n {/* Top skills */}\n {topSkills.length > 0 && (\n <div>\n <div style={{ fontSize: 12, color: 'rgba(255,255,255,0.5)', marginBottom: 8 }}>\n Most Popular Skills\n </div>\n {topSkills.map(([skill, count]) => {\n const pct = totalSkills > 0 ? (count / totalSkills) * 100 : 0;\n return (\n <div key={skill} style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 6 }}>\n <div style={{ width: 80, fontSize: 12, color: 'rgba(255,255,255,0.7)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {skill}\n </div>\n <div style={{ flex: 1, height: 6, background: 'rgba(255,255,255,0.06)', borderRadius: 3 }}>\n <div style={{ width: `${pct}%`, height: '100%', background: '#22d3ee', borderRadius: 3, minWidth: 2 }} />\n </div>\n <div style={{ width: 24, fontSize: 11, color: 'rgba(255,255,255,0.4)', textAlign: 'right' }}>\n {count}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\nfunction Stat({ label, value }: { label: string; value: number }) {\n return (\n <div>\n <div style={{ fontSize: 22, fontWeight: 700, color: 'rgba(255,255,255,0.95)' }}>{value}</div>\n <div style={{ fontSize: 11, color: 'rgba(255,255,255,0.4)' }}>{label}</div>\n </div>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useMemo","jsx","jsxs","useMemo"]}
|