UNPKG

alnilam-cli

Version:

Git-native AI career coach that converts multi-year ambitions into weekly execution

73 lines (72 loc) 6.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ActivityFeed = void 0; const jsx_runtime_1 = require("react/jsx-runtime"); const ink_1 = require("ink"); const ActivityFeed = ({ evidence, summaries, compact = false, maxItems = 10 }) => { // Get type emoji and color const getTypeDisplay = (type) => { switch (type) { case 'commit': return { emoji: '💾', color: 'blue', label: 'Commit' }; case 'pr': return { emoji: '🔀', color: 'green', label: 'PR' }; case 'time': return { emoji: '⏱️', color: 'yellow', label: 'Time' }; case 'note': return { emoji: '📝', color: 'gray', label: 'Note' }; case 'summary': return { emoji: '📊', color: 'purple', label: 'AI Summary' }; default: return { emoji: '📌', color: 'gray', label: type }; } }; // Format relative time const getRelativeTime = (dateString) => { const date = new Date(dateString); const now = new Date(); const diffMs = now.getTime() - date.getTime(); const diffMins = Math.floor(diffMs / (1000 * 60)); const diffHours = Math.floor(diffMs / (1000 * 60 * 60)); const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); if (diffMins < 1) return 'just now'; if (diffMins < 60) return `${diffMins}m ago`; if (diffHours < 24) return `${diffHours}h ago`; if (diffDays < 7) return `${diffDays}d ago`; return date.toLocaleDateString(); }; // Combine and sort activities const activities = [ ...evidence.map(e => ({ ...e, activityType: 'evidence' })), ...summaries.map(s => ({ ...s, activityType: 'summary', type: 'summary', message: s.content, created_at: s.date + 'T00:00:00Z' // Convert date to datetime for sorting })) ].sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime()) .slice(0, maxItems); if (compact) { // Compact view - just show count by type const typeCounts = evidence.reduce((acc, e) => { acc[e.type] = (acc[e.type] || 0) + 1; return acc; }, {}); return ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", children: [(0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "row", justifyContent: "space-between", marginBottom: 1, children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { color: "blue", bold: true, children: "Recent Activity" }), (0, jsx_runtime_1.jsxs)(ink_1.Text, { color: "gray", children: [evidence.length + summaries.length, " items"] })] }), (0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "row", gap: 2, children: [Object.entries(typeCounts).map(([type, count]) => { const display = getTypeDisplay(type); return ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "row", gap: 1, children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { children: display.emoji }), (0, jsx_runtime_1.jsx)(ink_1.Text, { color: display.color, children: count })] }, type)); }), summaries.length > 0 && ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "row", gap: 1, children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { children: "\uD83D\uDCCA" }), (0, jsx_runtime_1.jsx)(ink_1.Text, { color: "purple", children: summaries.length })] }))] })] })); } return ((0, jsx_runtime_1.jsx)(ink_1.Box, { flexDirection: "column", children: activities.length === 0 ? ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", height: 3, children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { color: "yellow", children: "\uD83C\uDF1F No recent activity" }), (0, jsx_runtime_1.jsx)(ink_1.Text, { color: "gray", dimColor: true, children: "Start tracking with: alnl evidence add" })] })) : ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", children: [activities.map((activity, index) => { const display = getTypeDisplay(activity.type); const isRecent = new Date().getTime() - new Date(activity.created_at).getTime() < 1000 * 60 * 60; // Within 1 hour return ((0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", marginBottom: 1, children: [(0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "row", justifyContent: "space-between", children: [(0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "row", gap: 1, alignItems: "center", children: [(0, jsx_runtime_1.jsx)(ink_1.Text, { children: display.emoji }), (0, jsx_runtime_1.jsx)(ink_1.Text, { color: display.color, bold: isRecent, children: display.label }), isRecent && (0, jsx_runtime_1.jsx)(ink_1.Text, { color: "green", children: "\u25CF" })] }), (0, jsx_runtime_1.jsx)(ink_1.Text, { color: "gray", dimColor: true, children: getRelativeTime(activity.created_at) })] }), (0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "column", marginLeft: 3, children: [(0, jsx_runtime_1.jsxs)(ink_1.Text, { children: [activity.message.substring(0, 60), activity.message.length > 60 ? '...' : ''] }), (0, jsx_runtime_1.jsxs)(ink_1.Box, { flexDirection: "row", gap: 2, marginTop: 0, children: [activity.activityType === 'evidence' && activity.metadata && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [activity.metadata.lines_added && ((0, jsx_runtime_1.jsxs)(ink_1.Text, { color: "green", dimColor: true, children: ["+", activity.metadata.lines_added, " lines"] })), activity.metadata.minutes && ((0, jsx_runtime_1.jsxs)(ink_1.Text, { color: "yellow", dimColor: true, children: [activity.metadata.minutes, " min"] })), activity.metadata.complexity && ((0, jsx_runtime_1.jsx)(ink_1.Text, { color: "blue", dimColor: true, children: activity.metadata.complexity }))] })), activity.activityType === 'summary' && ((0, jsx_runtime_1.jsxs)(ink_1.Text, { color: "purple", dimColor: true, children: [activity.evidence_count, " evidence items"] })), activity.goal_id && ((0, jsx_runtime_1.jsx)(ink_1.Text, { color: "gray", dimColor: true, children: "\uD83C\uDFAF linked" }))] })] })] }, `${activity.activityType}-${activity.id || activity.date}-${index}`)); }), (evidence.length + summaries.length) > maxItems && ((0, jsx_runtime_1.jsx)(ink_1.Box, { flexDirection: "row", justifyContent: "center", marginTop: 1, children: (0, jsx_runtime_1.jsxs)(ink_1.Text, { color: "gray", dimColor: true, children: ["... ", (evidence.length + summaries.length) - maxItems, " more activities"] }) }))] })) })); }; exports.ActivityFeed = ActivityFeed; exports.default = exports.ActivityFeed;